1 回答

TA貢獻1934條經驗 獲得超2個贊
您將接收到的數據視為 C 字符串(以 0 字節結尾的字節序列),這是不正確的。
recv
接收一些字節并將它們放入buffer
. 假設它收到了 200 字節。
那么你就這樣做strstr(buffer,eom_flag);
。strstr
不知道已收到 200 字節。strstr
從緩沖區的開頭開始,一直查找,直到找到 、 或 0 字節。即使您沒有收到,它也有可能在緩沖區的其他 824 字節中找到 a。
那你就做吧output += buffer;
。這也將緩沖區視為以 0 字節結尾。這將查看整個緩沖區(不僅僅是前 200 個字節)以查找 0 字節。然后它將把截至該點的所有內容添加到output
. 同樣,它可能會在緩沖區的最后 824 字節中找到 0 字節,并添加過多的數據。它可能根本在緩沖區中找不到 0 字節,然后它將繼續從存儲在buffer
內存中的其他變量中添加額外的數據?;蛘咚赡軙谇?200 個字節中找到 0 字節,并在那里停止(但前提是您發送了 0 字節)。
您應該做的是注意接收到的字節數(即iResult
)并將這些字節添加到輸出中。你可以使用:
output.insert(output.end(), buffer, buffer+iResult);
另外(正如 Phillipe Thomassigny 在評論中指出的那樣),“”可能不會立即全部收到。您可能會單獨收到“”。您應該檢查是否output
有“”,而不是檢查是否buffer
有“”。(這對性能的影響留給讀者作為練習)
順便說一下,這一行目前沒有做任何事情:
output.erase(std::find(output.begin(), output.end(), '\0'), output.end());
因為 '\0' 永遠不會被添加到output
,因為對于output += buffer;
,'\0' 告訴它在哪里停止添加。
- 1 回答
- 0 關注
- 197 瀏覽
添加回答
舉報