作者archon (三脚猫的把戏)
看板C_Sharp
标题[问题] 如何判断 socket disconnect
时间Tue Oct 7 19:09:44 2008
我写了个简单的 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)
1F:推 megaman1206:我的方法是使用stream reader...eof就是断线了XD 10/07 23:52
2F:推 tomex:以经验来说,tcp方式的断线侦测并不是很准,就算列举了catch 10/08 00:14
3F:推 tomex:对於client另一方的突然断电并无法准确预知,而造成except.. 10/08 00:15
4F:→ archon:就算是造成 Exception 我也好啊,但现在连 except 都没 XD 10/08 02:07
5F:→ archon:一楼的方法,是用 tcpclient 来实作吗(?) 10/08 02:08