【发布时间】:2021-10-27 15:06:44
【问题描述】:
我有一个程序使用 Boost.Asio 连接到本地主机上的服务器。这是代码的相关部分:
TcpClient::TcpClient(uint16_t port_number) : socket_(service_)
{
boost::asio::ip::tcp::resolver resolver(service_);
boost::asio::ip::tcp::resolver::query resolver_query("localhost", std::to_string(port_number));
auto endpoint_iterator = resolver.resolve(resolver_query);
boost::asio::connect(socket_, endpoint_iterator);
}
代码功能很好。在 Ubuntu 上,connect 函数几乎立即返回。但是,在 Windows 上,完成需要超过 2 秒。
单步执行 boost 代码,我发现这 2 秒都花在了 Winsock connect 函数调用上。
我是否遗漏了一些可以加快调用速度的东西(无论是在代码中还是在环境中)?
谢谢!
【问题讨论】:
-
我通常的嫌疑人是Nagle's algorithm。嗯,在这种情况下可能不是嫌疑人。
-
@Eljay AFAIK Nagle 不适用于
connect(),仅适用于send()。 -
可能与 IPv6 有关。检查
resolver.resolve返回的地址。还有,端口和服务器是什么? -
延迟 Acks (
TCP_QUICKACK) 可能有问题? -
我的猜测是
localhost可能返回一个 ipv4 和 ipv6 地址,首先尝试 ipv6 地址,然后在错误/超时后尝试 ipv4。
标签: c++ boost-asio winsock winsock2