在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 });
}
}
答案 0 :(得分:0)
套接字关闭不是“爆炸!!!”即时行动。调用shutdown / close只表示您终止连接的意图。实际断开连接可能在任意时间后发生(取决于很多事情,特别是对于环回连接)。
尝试以下操作:将Send()包装到while(true)循环中。你的第一次迭代可能没问题,然后你最终得到SocketException。