嗨,我想在poco中編寫一個TCP連接。客戶端發送的分組與該字段:如何複製Poco C++中的緩衝區字節塊?
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不是預期的。我試圖在沒有塊複製的情況下對其進行流式處理,並且手動接收沒有循環的每個域,這很好,並且有預期的數據。但是當我嘗試將傳入字節存儲到一個數組中,然後將該數組傳遞給內存流以讀取它時,我只有第一個塊正確且預期!
我真的需要將所有傳入的字節存儲到一個數組中,然後讀取整個數組,我該如何更改我的代碼?
非常感謝
感謝UR響應。是的,我對此感到困惑,畢竟當我改變char *爲char []時,我正在獲取完整的數據包。但實際上,當我想爲我的緩衝區考慮packetSize時,我無法調整Char []的大小,實際上C++並不接受數組的大小,它需要常量值,但它接受爲:'char * buffer = new char [packetSize ]',當我考慮char *時,我每次只得到4個字節,而不是完整的數據包。我怎麼解決這個問題? –
@AmirHasanHesam:我認爲你應該避免使用'sizeof()';你有期望的字節數:使用它。而且你只能使用一個緩衝區。我將編輯我的答案以顯示可能的解決方案。 – max66
感謝您的回覆,這是我需要的代碼。 –