在用于套接字通信的 while(1) 回圈的第一次迭代中,一切正常 - 在第二次迭代中,即使連接仍處于打開狀態且正在進行中(服務器的 send() 等待用戶插入資料,在同樣的套接字),來自客戶端的 recv() 無法等待資料。
while(1)
memset(buffer, 0, 300);
int nRet = recv(sock, buffer, 299, 0);
printf("Recv: %d\n", nRet);
if(nRet < 0)
fprintf(stderr, "recv() failed.");
else if(nRet == 0)
continue;
else
fprintf(stdout, buffer);
這是回圈的開始,這是值得關注的。在第二次迭代中,輸出是“Recv: 0”的無限列印。這對我來說似乎不合邏輯 - recv() 應該等到發送資料,并且服務器沒有發送任何資料。
uj5u.com熱心網友回復:
從我的 Linux 系統的手冊頁中,
當流套接字對等點執行了有序關閉時,回傳值將為 0(傳統的“檔案結束”回傳)。
各種域(例如,UNIX 和 Internet 域)中的資料報套接字允許零長度資料報。當接收到這樣的資料報時,回傳值為 0。
如果從流套接字接收的請求位元組數為 0,則也可能回傳值 0。
所以要么連接被關閉,要么你收到一個 0 位元組的資料報。無休止的重復暗示了前者。反復嘗試從關閉的連接中讀取不會神奇地重新打開它。
它不是一個錯誤。
這些呼叫回傳接收到的位元組數,如果發生錯誤,則回傳 -1。如果發生錯誤,則設定 errno 以指示錯誤。
信號中斷會導致錯誤EINTR。如果套接字被設為非阻塞并且沒有可用的東西,則會導致錯誤EAGAIN或EWOULDBLOCK. 你沒有經歷過這些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/427540.html
