簡體   English   中英

在不知道緩沖區大小的情況下從套接字讀取

[英]Read from a socket without knowing the size of the buffer

我在所有消息的末尾添加了一個分隔符,所以我知道什么時候到達了消息的末尾。 一旦我的消息超過緩沖區的指定大小,並且我必須第二次從套接字讀取,就會發生奇怪的事情。 例如,一個隨機的 '\\n' 字符將隨機出現在我的消息中的某個地方,只有當我不得不多次從同一個套接字讀取時才會發生這種情況,因為消息大於緩沖區的大小。 下面的代碼有什么缺陷嗎?

我正在使用 Unix 套接字頭文件。

std::string bufferStr;

// check to see if the delimiter is in the buffer string
while(bufferStr.find(DELIM)==std::string::npos)
        {
            valread = read(sock,buffer,1024);
            bufferStr+=std::string(buffer);
        }

這里有很多問題,但最重要的是你忽略了讀取的字節數。

必須注意這一點,並在構造字符串時使用它:

std::string(buffer, valread);

如果您忽略這一點,那么您將傳入假定為以 NUL 結尾的 C 字符串,但您只有原始數據,沒有終止符,以及上次讀取調用的剩余垃圾。

您還應該檢查valread是否 > 0,因為這可能表示讀取時出現錯誤。 將負值傳遞給構造函數會導致問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM