2010-10-28 187 views
0

全部 我正在使用一個非阻塞Socket來發送messages.We得到EGAIN錯誤occassioanally。所以我決定使用Flush(套接字)來沖洗緩衝區並使空間對於新的空間,以便我可以避免EGAIN錯誤。但問題是Flush(套接字)卡住了無限期的時間。嵌套Socket阻塞非阻塞SocketHi

下面是代碼

int res = send(socket, buffer, size+lengthSize,0); 


delete buffer; 

if (res== -1) 

{ 

int error = errno; 

cout("ERROR on SendOnPortString, errno = " << error); 

return 0 ; 

} 

else 

{ 

    cout<<"Send SucessFul = " << res << "Total Message size"<< size+lengthSize; 

    if(res==size+lengthSize) 

    flush((ostream&)socket); 

    //flush(socket); 


    return 1 ; 

    } 

此代碼打印 發送SUCESSFUL = 11Total消息大小11

但在此之後其被陷在沖洗(插座)方法。任何知道爲什麼它的行爲就像該

回答

0

您將類型爲int的套筒手柄轉換爲對std::ostream的引用,以避免在嘗試將其傳遞到flush時發生編譯器警告/錯誤。我很驚訝它不會崩潰。

您無法騰出更多空間。問題不在於你:問題在於系統的內部緩衝區已滿,他們將在自己的時間以自己的速度耗盡。您可以通過反覆嘗試send直到它工作(在這種情況下,您爲什麼使用非阻塞套接字?)進行輪詢,或者您使用selectpollkqueue,epoll, libevent等睡眠直到套接字能夠接受更多的數據。

+0

它會回覆'EAGAIN',如果它因任何原因而阻塞。你沒有提到你的平臺;如果它是開放的,只需檢查內核源代碼。爲什麼不必要地猜測? – 2010-10-28 15:02:31