boost::asio 与 no_delay 不可能吗?

use*_*536 6 c++ boost boost-asio

我知道的...

我需要根据/sf/answers/1810987531/set_option(tcp::no_delay(true))之前调用,否则不会有任何效果。connect()

此外,仅当根据/sf/answers/899185171/事先打开套接字时, 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));
Run Code Online (Sandbox Code Playgroud)


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


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

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

Tan*_*ury 4

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

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

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

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

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

socket.open(tcp::v4());
socket.set_option(tcp::no_delay(true));
socket.async_connect(endpoint, handler);
Run Code Online (Sandbox Code Playgroud)