你好,我正在尝试使用Poco编写TCP连接。客户端发送了一个包含以下字段的数据包:
packetSize : int
date : int
ID : int
因此,前4个字节包含数据包大小。在接收端,我有以下代码:
int packetSize = 0;
char *bufferHeader = new char[4];
// receive 4 bytes that contains packetsize here
socket().receiveBytes(bufferHeader, sizeof(bufferHeader), MSG_WAITALL);
Poco::MemoryInputStream *inStreamHeader = new Poco::MemoryInputStream(bufferHeader, sizeof(bufferHeader));
Poco::BinaryReader *BinaryReaderHeader = new Poco::BinaryReader(*inStreamHeader);
(*BinaryReaderHeader) >> packetSize; // now we have the full packet size
现在我正在尝试将所有剩余的输入字节存储到一个数组中,以备将来进行二进制读取:
int ID = 0;
int date = 0;
int availableBytes = 0;
int readedBytes = 0;
char *body = new char[packetSize - 4];
do
{
char *bytes = new char[packetSize - 4];
availableBytes = socket().receiveBytes(bytes, sizeof(bytes), MSG_WAITALL);
if (availableBytes == 0)
break;
memcpy(body + readedBytes, bytes, availableBytes);
readedBytes += availableBytes;
} while (availableBytes > 0);
Poco::MemoryInputStream *inStream = new Poco::MemoryInputStream(body, sizeof(body));
Poco::BinaryReader *BinaryReader = new Poco::BinaryReader(*inStream);
(*BinaryReader) >> date;
(*BinaryReader) >> ID;
cout << "date :" << date << endl;
cout << "ID :" << ID << endl;
问题在于正文的字节块没有存储剩余的字节,它总是只有前4个字节(日期)。因此,在输出中,日期是正确的,但是ID不符合预期。我尝试了流式传输而没有块复制,并手动接收每个字段而不使用循环,结果很好,数据也如预期。但当我试图将传入的字节存储到一个数组中,然后将该数组传递给MemoryStream以读取它时,我只有第一个块是正确的且符合预期!
我真的需要将所有传入的字节存储到一个数组中,然后读取整个数组,我应该如何更改我的代码?
非常感谢。
char * buffer = new char [packetSize]
,而当我使用char *时,每次只能获取4个字节而不是整个数据包。我该如何解决这个问题? - AmirHasan Hesamsizeof()
这种方式;你已经知道了期望的字节数: 利用它。而且你可以只使用一个缓冲区。我将编辑我的答案,展示一种可能的解决方案。 - max66