【问题标题】:boost::asio with no_delay not possible?没有 no_delay 的 boost::asio 不可能?
【发布时间】:2015-12-04 14:05:56
【问题描述】:

我知道的……

我需要根据https://stackoverflow.com/a/25871250connect()之前调用set_option(tcp::no_delay(true)),否则没有效果。

此外,set_option() 仅在根据https://stackoverflow.com/a/12845502 预先打开套接字时才起作用。

但是,async_connect() 的文档指出,如果在处理连接设置之前已打开传递的套接字,则将关闭传递的套接字(请参阅async_connect())。

这意味着我选择的方法没有正确设置 NO_DELAY(我已经在 Windows 7 x64 上对此进行了测试,所以我可以肯定地说)。

if ( socket.is_open() ) {
    socket.close();
}
socket.open(tcp::v4());
socket.set_option(tcp::no_delay(true));
socket.async_connect(endpoint, bind(&MySession::connectComplete, this, asio::placeholders::error));


问题:如何使用 Boost ASIO 正确设置 NO_DELAY 以打开客户端连接?


P.S.:我使用的是 Boost 1.53。切换到另一个 Boost 版本对我来说并不容易。

P.P.S.:不在我的程序中设置 NO_DELAY,而是在注册表中设置网络接口解决了这个问题,但这会影响所有应用程序,这不是我的意图。见description

【问题讨论】:

标签: c++ boost boost-asio


【解决方案1】:

async_connect() free 函数将关闭套接字:

如果套接字已经打开,它将被关闭。

但是,socket.async_connect() 成员函数不会关闭套接字:

如果套接字尚未打开,则会自动打开它。如果连接失败,并且套接字自动打开,则套接字不会返回关闭状态。

以下代码将在打开的套接字上设置no_delay选项,然后为打开的套接字启动异步连接操作:

socket.open(tcp::v4());
socket.set_option(tcp::no_delay(true));
socket.async_connect(endpoint, handler);

【讨论】:

  • 似乎我输入了错误的文档条目。但是,它没有解释为什么我仍然得到延迟的 TCP ACK。这对你有用吗?
  • 它对我有用 (demo)。也许您可以使用小演示程序来验证选项是否设置正确。
【解决方案2】:

连接后立即设置。 Nagle 算法在内核收到 ASK 数据包之前发送任何数据后起作用。因此,连接操作无关紧要。只需在连接后、任何发送之前立即设置即可。

socket.async_connect(ep, yield);
socket.set_option(tcp::no_delay(true));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多