Socket.Receive即使在客户端ShutDown()之后仍会阻塞

时间:2018-11-09 15:34:48

标签: c# sockets

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

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://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.receive?view=netframework-4.7.2

  

如果远程主机使用Shutdown方法关闭Socket连接,并且已接收到所有可用数据,则Receive方法将立即完成并返回零字节。

但是它永远在这里等待。

有趣的是,如果我使用PuTTY连接到服务器应用程序,然后关闭PuTTY,则Receive()方法完成并返回size = 0 。PuTTY在做什么,我不是吗?

注意:我也尝试在客户端应用程序上使用TcpClient,但这有相同的问题。

1 个答案:

答案 0 :(得分:0)

原来是我的错,如果有人遇到同样的问题,我会把它留在这里。

在尝试Minu的建议时,我注意到如果我不发送数据就关闭插座,则Receive()正确完成了。

事实证明,在代码的其他地方,我让服务器在收到完整的数据后发送回确认。但是,客户端的接收确认方法存在一个错误,该错误导致其无法完全从套接字接收消息,因此套接字上仍然有7个字节Available,这就是为什么它没有关闭的原因。