[問題] 如何判斷 socket disconnect
我寫了個簡單的 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
10/07 23:52, 1F
推
10/08 00:14, , 2F
10/08 00:14, 2F
推
10/08 00:15, , 3F
10/08 00:15, 3F
→
10/08 02:07, , 4F
10/08 02:07, 4F
→
10/08 02:08, , 5F
10/08 02:08, 5F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):