为什么 TcpClient 与构造函数中的参数连接较慢?

Mat*_*int 5 .net c# sockets tcpclient

我有问题System.Net.Sockets.TcpClient

一个简单的测试应用程序只是打开一个连接,发送一些数据,然后关闭。另一端有一个简单的服务器,其性能很好。

代码如下所示:

var client = new TcpClient("localhost", 1234);
using (var stream = client.GetStream())
using (var writer = new StreamWriter(stream))
{
    writer.Write("foo");
    writer.flush();
}
client.Close();
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我注意到单元测试的运行时间超过 1000 毫秒。当我把它放在一个叫做 10 次的循环中时,它是 > 10,000 毫秒。

在对客户端和服务器上的时间进行数小时的调试后,我发现它很慢。
修复是从这里更改代码:

var client = new TcpClient("localhost", 1234);
Run Code Online (Sandbox Code Playgroud)

对此:

var client = new TcpClient();
client.Connect("localhost", 1234);
Run Code Online (Sandbox Code Playgroud)

这让一切变得不同。现在一通大约需要 10 毫秒,而 10 通则略小于 100 毫秒。

为什么???

小智 5

来自http://msdn.microsoft.com/en-us/library/115ytk56(v=vs.110).aspx

“如果启用 IPv6 并调用 TcpClient(String, Int32) 方法连接到解析为 IPv6 和 IPv4 地址的主机,则将首先尝试连接到 IPv6 地址,然后再尝试连接 IPv4 地址。这可能会产生影响如果主机未侦听 IPv6 地址,则延迟建立连接的时间。”

我不确定为什么默认构造函数也不会这样做(我原以为您必须使用带有 AddressFamily 的构造函数并在连接之前指定 IPv4),但显然它没有。