好的,这就是事情的进展:
[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上有一个套接字,可能会出现问题吗?
谢谢。
答案 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
}