似乎使用socket.Close()关闭TCP套接字时,无法完全关闭套接字。 在以下示例中,我正在尝试连接到未打开的端口9999上的example.com,并在短暂超时后尝试关闭套接字。
for (int i = 0; i < 200; i++)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.LingerState = new LingerOption(false, 0);
sock.BeginConnect("www.example.com", 9999, OnSocketConnected, sock);
System.Threading.Thread.Sleep(50);
sock.Close();
}
但是当我在循环完成后查看netstat时,我发现有很多半开放的套接字:
TCP israel-xp:6506 www.example.com:9999 SYN_SENT
TCP israel-xp:6507 www.example.com:9999 SYN_SENT
TCP israel-xp:6508 www.example.com:9999 SYN_SENT
TCP israel-xp:6509 www.example.com:9999 SYN_SENT
编辑 。 缺少一些上下文信息。我正在使用beginconnect,因为我希望套接字连接失败(9999未打开),在我的实际代码中,一旦设置了计时器,我就调用socket.Close()。 在OnSocketConnected中,我调用EndConnect,它会引发异常(尝试调用已处理的对象的方法)。 我的目标是对套接字连接阶段进行短暂超时。
你有什么线索吗? 谢谢!