我所知道的......
我需要根据https://stackoverflow.com/a/25871250在set_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。
答案 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));