1 回答

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