2013-07-05 62 views
0

我有連接到服務器的客戶端iOS應用程序。 它使用非阻塞套接字。檢測斷開的插座?

int fl; 
fl=fcntl(s,F_GETFL,0); 
fcntl(s,F_SETFL, fl | O_NONBLOCK); 

int set = 1; 
setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int)); 
  • 如果沒有數據,那麼通過-1 read
  • 返回如果斷開連接,然後通過0 read

返回,但它並不總是正確的。有時連接丟失,但返回-1。

是否有像eof這樣的東西來檢測?

回答

0

0是EOF。如果有錯誤 -1通過讀取返回,並且您應該查看errno以查看它是什麼。檢測TCP中斷連接的唯一可靠方法是至少寫兩次。

+0

@downvoter如果你知道一些我不關於TCP的內容,請與我們分享。就我而言,無法解釋的downvotes僅僅是網站破壞行爲。 – EJP

+0

我還沒有投票給你。我認爲當返回-1時檢查'errno!= ENODATA'是有意義的 – Max

+0

@Max否,如果你處於非阻塞模式,檢查它是否爲'EAGAIN'或'EWOULDBLOCK'是有意義的。 'recv()'不設置'ENODATA'。 – EJP