客户端仍然可以发送到封闭的服务器端套接字

时间:2017-12-20 15:52:13

标签: c# .net sockets

在TCP Socket服务器中,如果服务器接受来自客户端的连接,然后关闭与客户端连接关联的套接字,则客户端仍然可以将数据发送到服务器。客户没有例外。

为什么不关闭此套接字会导致客户端出现异常?

我希望客户端尝试发送,意识到它不再连接到服务器套接字然后引发异常。显然,这并没有发生,这意味着我对套接字应该如何工作的假设是不正确的(很可能)或我的代码(下面)是错误的。 : - )

public async Task Demo()
{
    var endPoint = new IPEndPoint(IPAddress.Loopback, 2100);
    var serverTask = Task.Run(() =>
    {
        using (var listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
        {

            listenSocket.Bind(endPoint);
            listenSocket.Listen(backlog: 1);

            using (var connectionSocket = listenSocket.Accept())
            {
                connectionSocket.Shutdown(SocketShutdown.Both);
                connectionSocket.Close();
            }
        }
    });

    using (var clientSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
    {
        clientSocket.Connect(endPoint);

        await serverTask;

        // Expect this to throw a SocketException--but it doesn't.
        clientSocket.Send(new byte[] { 01 });
    }
}

1 个答案:

答案 0 :(得分:0)

套接字关闭不是“爆炸!!!”即时行动。调用shutdown / close只表示您终止连接的意图。实际断开连接可能在任意时间后发生(取决于很多事情,特别是对于环回连接)。

尝试以下操作:将Send()包装到while(true)循环中。你的第一次迭代可能没问题,然后你最终得到SocketException。