套接字.即使在客户端关闭()之后也会接收阻塞



我有一个带有套接字侦听的服务器应用程序:

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,这就是它没有关闭的原因。

相关内容

最新更新