我有一个带有套接字侦听的服务器应用程序:
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。
根据本页:
https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.receive?view=netframework-4.7.2
如果远程主机使用Shutdown方法关闭Socket连接,并且已接收到所有可用数据,则Receive方法将立即完成并返回零字节。
但它只是在这里永远等待。
有趣的是,如果我用PuTTY连接到服务器应用程序,然后关闭PuTTY,那么Receive()
方法会完成并返回size
=0。普蒂在做什么而我不是?
注意:我也尝试过在客户端应用程序上使用TcpClient
,但这也有同样的问题。
原来是我的错,我会把它留在这里,以防其他人也有同样的问题。
在尝试Minu的建议时,我注意到如果我在没有发送数据的情况下关闭了套接字,那么Receive()
就正确完成了。
事实证明,在我的代码的其他地方,我让服务器在收到完整的数据后发回确认。然而,客户端接收确认的方法中有一个错误,导致它无法完全从套接字接收确认,因此套接字上仍有7个字节的Available
,这就是它没有关闭的原因。