客户端仍然可以发送到封闭的服务器端插座[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

在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 });
    }
}
c# .net sockets
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.