使用no_delay的boost :: asio不可能吗?

时间:2015-12-04 14:05:56

标签: c++ boost boost-asio

我所知道的......

我需要根据https://stackoverflow.com/a/25871250set_option(tcp::no_delay(true))之前致电connect(),否则将无效。

此外,只有在根据https://stackoverflow.com/a/12845502预先打开套接字时,set_option()才有效。

但是,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));


问题:如何正确设置启动ASIO的NO_DELAY以打开客户端连接?


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

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

2 个答案:

答案 0 :(得分:2)

async_connect()免费功能将关闭套接字:

  

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

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

  

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

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

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

答案 1 :(得分:0)

连接后立即设置。在内核收到ASK数据包之前发送任何数据后,Nagle算法有效。所以连接操作无关紧要。只需在连接之后立即设置,然后再发送。

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