无法收集 tcp 数据以矢量 openframworks

Can't collect tcp data to vector openframworks

本文关键字:openframworks 数据 tcp      更新时间:2023-10-16

我正试图通过xtcpclient从指针填充一个矢量字符。

指针tmpData正在接收数据,但如果我试图将数据推入向量,我会得到此错误。

即使我尝试像这样用字符"手动"填充向量:tcpMainData.push_back (' a ');

出现错误:

libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
(lldb) 

这是我的程序:

#include "ofApp.h"
using namespace std;
vector<char> tcpMainData;
//This is a temporary size variabel, until a function is made.
int tmpDataSize = 100;
char tmpData;

//--------------------------------------------------------------
void ofApp::setup(){
}
//--------------------------------------------------------------
void ofApp::update(){
    //Listen on the port for tcp data if we are connected to the server
    if (!TCPClient.isConnected()) {
        state = OFFLINE;
    }else if (TCPClient.isConnected() && state != RECEIVING) {
                state = LISTENING;
    }
    //TCP package received
    if((int)TCPClient.receiveRawBytes((char *) &tcpMainData, sizeOfTcpChunk) > 1 && state == LISTENING) {
        state = RECEIVING;
    }
    //Filling up vector with tcp data
    if (state == RECEIVING) {
        for (int i = 0; i < tmpDataSize; i++) {
            TCPClient.receiveRawBytes((char *) &tmpData, sizeOfTcpChunk);
            tcpMainData.push_back(tmpData);
        }
        state = LISTENING;
    }
}
//--------------------------------------------------------------
void ofApp::draw(){
    if (state == OFFLINE) {
        ofDrawBitmapString("Press C to connect", 50, 100);
    }
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
    if (key == 'c') {
        TCPClient.setup("127.0.0.1", TCPPort);
    }
}

这是我的标题,如果它是相关的:

...
//TCP CONF
ofxTCPClient TCPClient;
int TCPPort = 50014;
int sizeOfTcpChunk = 4;             //Size of TCP packages (Chunks)
//Program state
enum clientState {
    OFFLINE,
    LISTENING,
    RECEIVING,
};
clientState state = LISTENING;

你漏掉了错误发生的地方。
这里有两件事是错误的(我把你的代码点放在这里的上下文中):

vector<char> tcpMainData;
TCPClient.receiveRawBytes((char *) &tcpMainData, sizeOfTcpChunk)

将vector类型转换为char*错误。应该是

(char *) &tcpMainData[0]

,我强烈怀疑你可以用它来写tcpMainData。此强制转换仅用于从vector对象中读取数据。我的猜测是,您会因此得到错误消息。

char tmpData;
TCPClient.receiveRawBytes((char *) &tmpData, sizeOfTcpChunk);

正如Galik提到的,tmpData是一个字节。你需要char tmpData[100]

作为参考,TCPClient的签名。receiveRawBytes函数为:

int ofxTCPClient::receiveRawBytes(char *receiveBytes, int numBytes)