使用System.Net.Socket,我们如何知道远程套接字何时关闭?

时间:2009-05-27 00:30:27

标签: c# .net sockets

好的,这就是事情的进展:

[Server] Start
[Server] Socket.AcceptConnection
[Client] Start
[Client] Socket.Connect 
[Server] Receive //blocking
[Client] Send
[Server] Print
[Server] Receive
[Client] Close socket

有没有办法知道客户端何时关闭连接? 我目前正在使用MSDN上描述的假数据包技巧,我在一个单独的线程上进行了

[Server] socket.Send(byte[], 0,0);

我检查它是否会抛出任何错误,但它没有,即使客户端关闭套接字。

P.S。我正在考虑,如果我在服务器端(TCP)和客户端的TcpClient上有一个套接字,可能会出现问题吗?

谢谢。

3 个答案:

答案 0 :(得分:5)

根据Socket.Connected的文档:

  

Connected属性的值   反映了连接的状态   截至最近的一次行动。如果   你需要确定当前   连接状态,制作一个   非阻塞,零字节发送呼叫。如果   调用成功返回或   抛出WAEWOULDBLOCK错误代码   (10035),然后套接字仍然是   连接的;否则,套接字是否定的   更长时间的连接。

请注意,就我所见,您当前的通话是阻止通话 - 您需要根据该文档进行非阻止通话。

答案 1 :(得分:1)

TCP连接应该在已经收到FIN的套接字读取时返回0,即EOF,但是你最好不要设计你的协议,以便各方告诉对方何时是是时候断开/关闭插座了。从多个线程玩同一个套接字会让你感到厌烦 - 避免它。

答案 2 :(得分:0)

bool part1 = s.Poll(1000, SelectMode.SelectRead);
bool part2 = (s.Available == 0);
if (part1 & part2)
{//connection is closed
}