2012-10-10 14 views
3

已經建立了一個有效的套接字連接到服務器。有一個簡單的循環,旨在繼續接收數據,直到服務器停止發送更多。所有的文檔都指出,嘗試recv()太多次只會導致它返回0或-1(取決於情況)。相反,它會使用某種IOError(與recv調用相關)來殺死線程。我錯過了什麼?C++ winsock recv在接收0數據時終止線程而不是返回錯誤代碼

編輯:sad只是一些stringstream。我保證它與問題無關:D

另一個編輯:包括errno.h和檢查errno代碼,無濟於事。

do {    
    memset(buffer,0,sizeof(buffer)); 
    bytes = recv(s,buffer,sizeof(buffer)-40,0); 
    sad << buffer; 
    Sleep(1); 
} while (bytes>0); 

回答

1

也許你也應該檢查errno,因爲通信信道可能有一個過早結束。

#include <errno.h> 
#include <string.h> 

do {    
    memset(buffer,0,sizeof(buffer)); 
    bytes = recv(s,buffer,sizeof(buffer)-40,0); 
    if (errno) 
     break; 
    sad << buffer; 
    Sleep(1); 
} while (bytes>0); 

if (errno) 
    std::cerr << "Premature end of connection: " << strerror(errno) << '\n'; 
+0

試過了,但線程剛剛死掉,當以'bytes ='開始的行運行時。包括/檢查errno並沒有改變它,雖然是一個很好的想法。 – TheToolBox

+0

嘗試處理SIGPIPE:http://stackoverflow.com/questions/108183/how-to-prevent-sigpipes-or-handle-them-properly(順便說一下,信號通常也會中斷睡眠) – sehe

+0

我剛剛試了一對夫婦的方式,但無法弄清楚如何強制處理它。我正在windows下編譯,我相信像往常一樣問題。看起來我沒有'SO_NOSIGPIPE',也沒有'signal(SIGPIPE,SIG_IGN);'爲我做。試圖尋找一個標誌運行與recv忽略它,但文件並沒有顯示任何東西...編輯:也迅速學習unix和這些信號的窗口實現之間的差異 – TheToolBox