我最近偶然发现了一个非常奇怪的错误。我首先认为这是我的代码中的错误,但是现在我可以看到这是系统范围的事情,说过,我认为我的问题最合适。
我看到我的网络库非常奇怪的行为,当我开始调试时,我发现如果我将连接到tcp套接字,最常见的是 - 在我开始监听后不久我的套接字将在SYN_RCVD和SYN_SENT状态中“卡住” 。经过更多的调试后,我完全删除了所有代码,而我还是留下了这个:
while (true)
{
TcpListener listener = new TcpListener(54000);
listener.Start();
var c = listener.AcceptTcpClientAsync();
TcpClient client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Loopback, 54000));
c.Result.Close();
client.Close();
listener.Stop();
Console.WriteLine("done");
}
(上面的类是System.Net.Sockets1
,而不是我的。
这个代码,在我的机器上将生成1-5 done
s然后将挂起3个套接字:监听套接字(在监听状态下绑定到0.0.0.0:54000
和2个套接字,一个卡在SYN_RCVD中, SYN_SENT中的另一个)。我尝试在不同的机器上运行,代码运行正常,然后我在我的“损坏”机器上的Linux VM上尝试了它,它仍然运行正常。
Node.js中的类似代码也被卡住了。