У меня возникли проблемы с настройкой опции no_delay на гнездо asio. Следующий код работает хорошо, за исключением задержки. Мой сервер получает сообщения только после истечения 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