我有一个带有套接字监听功能的服务器应用程序:
server = new TcpListener(myEndPoint);
// etc.
socket = server.AcceptSocket();
while (true) {
int size = socket.Receive(data); // application waits here for data.
if (size == 0)
{
// handle disconnect
}
else
{
// process data.
}
}
现在,客户端应用程序已连接到此...
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(remoteIp, remotePort);
发送数据,完成后调用
socket.ShutDown(SocketShutdown.Both);
在这一点上,我希望在socket.Receive(data)
处于阻塞状态但size
为0的服务器继续运行。
按照此页面:
如果远程主机使用Shutdown方法关闭Socket连接,并且已接收到所有可用数据,则Receive方法将立即完成并返回零字节。
但是它永远在这里等待。
有趣的是,如果我使用PuTTY连接到服务器应用程序,然后关闭PuTTY,则Receive()
方法完成并返回size
= 0 。PuTTY在做什么,我不是吗?
注意:我也尝试在客户端应用程序上使用TcpClient
,但这有相同的问题。
答案 0 :(得分:0)
原来是我的错,如果有人遇到同样的问题,我会把它留在这里。
在尝试Minu的建议时,我注意到如果我不发送数据就关闭插座,则Receive()
正确完成了。
事实证明,在代码的其他地方,我让服务器在收到完整的数据后发送回确认。但是,客户端的接收确认方法存在一个错误,该错误导致其无法完全从套接字接收消息,因此套接字上仍然有7个字节Available
,这就是为什么它没有关闭的原因。