我遇到了在asio套接字上設置no_delay選項的麻煩。下面的代碼運行良好,除了延遲。我的服務器只有在5000毫秒到期後纔會收到消息。設置ASIO no_delay選項
#include <boost/asio.hpp>
#include <boost/thread.hpp>
using namespace boost::asio;
struct Client
{
io_service svc;
ip::tcp::socket sock;
Client() : svc(), sock(svc)
{
ip::tcp::resolver resolver(svc);
ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query("127.0.0.1", "32323"));
connect(sock, endpoint);
}
void send(std::string const& message) {
sock.send(buffer(message));
}
};
int main()
{
Client client;
client.send("hello world\n");
client.send("bye world\n");
boost::this_thread::sleep_for(boost::chrono::milliseconds(5000));
}
當試圖增加延遲,我有幾個選擇:
1)連接之前添加的選項:
Client() : svc(), sock(svc)
{
ip::tcp::resolver resolver(svc);
ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query("127.0.0.1", "32323"));
sock.set_option(ip::tcp::no_delay(true));
connect(sock, endpoint);
}
然而,這將引發set_option: Bad file descriptor
2)添加選項後連接:
Client() : svc(), sock(svc)
{
ip::tcp::resolver resolver(svc);
ip::tcp::resolver::iterator endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query("127.0.0.1", "32323"));
connect(sock, endpoint);
sock.set_option(ip::tcp::no_delay(true));
}
如何在這種情況下,該選項不起作用,我仍然看到延遲。根據boost::asio with no_delay not possible?,我需要在打開套接字之後但在連接套接字之前設置選項。所以我試過這個:
Client() : svc(), sock(svc)
{
ip::tcp::endpoint endpoint(ip::address::from_string("127.0.0.1"), 32323);
sock.open(ip::tcp::v4());
sock.set_option(ip::tcp::no_delay(true));
sock.connect(endpoint);
}
但是,我仍然沒有看到任何效果。我怎樣才能設置這個選項?
編輯:有可能我沒有在服務器端正確設置選項。這是完整的服務器代碼:
#include <boost/asio.hpp>
#include <iostream>
int main() {
boost::asio::io_service io_service;
boost::asio::ip::tcp::acceptor acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 32323));
boost::asio::ip::tcp::socket socket(io_service);
acceptor.accept(socket);
socket.set_option(boost::asio::ip::tcp::no_delay(true));
boost::asio::streambuf sb;
boost::system::error_code ec;
while (boost::asio::read(socket, sb, ec)) {
std::cout << "received:\n" << &sb;
}
}
服務器是否也設置了'no_delay'選項? – Arunmu
感謝您的迴應。我沒有把它設置在服務器端。我想我現在正在設置它,但仍然沒有看到效果。我編輯了原始文章以包含服務器代碼。 – Stewart