[英]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個字節的數據,則其后的內容可能是空字符(例如,在您的服務器上),也可能是其他字符(在您的客戶端上)。 這是程序執行的產物,而不是您如何編程的產物。
解決此問題的最簡單,最快的方法:
MAXBUF + 1
buffer
。 +1將代表一個額外的NULL字符。 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.