[問題] 如何判斷 socket disconnect

看板C_Sharp作者 (三腳貓的把戲)時間17年前 (2008/10/07 19:09), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串1/2 (看更多)
我寫了個簡單的 Client-Server 結構,  Server 收封包的部份用 thread 來跑底下這個副程式: private void Connecting() { byte[] reciByte; string strMsg = ""; bool bContinue = true; int RecvCount; while (bContinue) { reciByte = new byte[32]; try { // 收封包 RecvCount = m_ServerSocket.Receive(reciByte); strMsg = Encoding.Default.GetString(reciByte); // 如果有收到東西就跳一個 Message Box 出來 if (RecvCount > 0) { MessageBox.Show(strMsg); for (int i = 0; i < 32; i++) reciByte[i] = 0; } } catch (SocketException e) { MessageBox.Show("[Connecting] SocketException!!"); bContinue = false; } // 判斷 socket 是否仍在連線 if (!m_ServerSocket.Connected) { bContinue = false; MessageBox.Show("Disconnect!!"); } else { // Socket.Connected 為真,就會跳出 Socket is alive MessageBox.Show("Socket is alive"); } } }  收封包的時候運作正常,但是當 Client 端要切斷連線時,  Server 端卻無法得知 Socket 已經斷線了,  我在 Client 端用了三種函式來切斷連線,分別是:  Shutdown(SocketShutdown.Both); Disconnect(true); Close();  不論使用哪一種,Server 端都會不斷地跳出 Socket is alive 的 Message Box,  表示 m_ServerSocket.Receive(reciByte); 已經不會 Block 住了,  但是 m_ServerSocket.Connected 卻沒有被設為 false,  我開 sniffer 抓封包顯示 TCP FIN 有送出,Server 也 ACK 了。  請問,當對方連線送出 Disconnect 或 Close 後,  本地端到底該怎麼判斷此連線已經中斷了?  另一個問題,如果關掉的 socket 想拿來建立別的連線,  那是不是該用 Disconnect() 而非 Close()? --  追根究底所得到的東西,是失望的觀眾,以及狼狽的魔術師... De'Ring Practice http://www.im.tv/vlog/Personal/623262/2093392 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.42.81 ※ 編輯: archon 來自: 140.112.42.81 (10/07 19:10)

10/07 23:52, , 1F
我的方法是使用stream reader...eof就是斷線了XD
10/07 23:52, 1F

10/08 00:14, , 2F
以經驗來說,tcp方式的斷線偵測並不是很準,就算列舉了catch
10/08 00:14, 2F

10/08 00:15, , 3F
對於client另一方的突然斷電並無法準確預知,而造成except..
10/08 00:15, 3F

10/08 02:07, , 4F
就算是造成 Exception 我也好啊,但現在連 except 都沒 XD
10/08 02:07, 4F

10/08 02:08, , 5F
一樓的方法,是用 tcpclient 來實作嗎(?)
10/08 02:08, 5F
文章代碼(AID): #18wqDwpW (C_Sharp)
文章代碼(AID): #18wqDwpW (C_Sharp)