簡體   English   中英

從套接字讀取緩沖區

[英]reading buffer from socket

我正在用c編寫簡單的服務器/客戶端,其中服務器臨時存儲來自客戶端的消息,並在客戶端請求時檢索它。

問題是當客戶端從服務器接收消息時,緩沖區有點奇怪。 我所做的全部與從服務器接收到的一樣多,並且將其打印在屏幕上,但是不知何故,緩沖區被覆蓋的程度超過了緩沖區的最大大小

在客戶中

while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0)
{
   if(byteRead <= 0)
       break;
    printf("%s", buffer);
}

其中MAXBUF是256。它包含一些垃圾,因此我檢查了緩沖區中的字符串大小,並且令人驚訝地

printf("%d READ vs %d buffer strlen \n", byteRead, strlen(buffer))

告訴我byteRead是256,但是緩沖區的字符串長度是262。

任何想法??

服務器端的ps,它正確讀取文件並將其發送到套接字。

recv不會在字符串的末尾放置一個空終止符(而printf %s假定存在一個終止符)。

您必須使用byteRead來確定字符串的長度。 如果要使用類似printf ,請添加一個空終止符,但即使在最大大小的讀取時,也要確保緩沖區具有printf的空間。

這里的問題是buffer不是由recv()終止的。 實際上, recv僅將原始套接字數據放入緩沖區。 如果它接收256個字節的數據,則其后的內容可能是空字符(例如,在您的服務器上),也可能是其他字符(在您的客戶端上)。 這是程序執行的產物,而不是您如何編程的產物。

解決此問題的最簡單,最快的方法:

  1. 分配大小為MAXBUF + 1 buffer +1將代表一個額外的NULL字符。
  2. printf之前,立即在buffer[bytesRead]處添加一個空字符。

所以說:

buffer = malloc((MAXBUF + 1) * sizeof(char));          // NEW

while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0)
{
    if(byteRead <= 0)
        break;
    else {
        buffer[bytesRead] = '\0';                      // NEW
        printf("%s", buffer);
    }
}

是。

像傳統的C字符串一樣,strlen()查找最接近的NULL終止符。

recv()與空終止符無關,也不會加一個。 因此,strlen調用是錯誤的,甚至可能因未經授權的讀取而使程序崩潰。

暫無
暫無

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

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