gpt4 book ai didi

tcp - 设置 ASIO no_delay 选项

转载 作者:可可西里 更新时间:2023-11-01 02:48:22 33 4
gpt4 key购买 nike

我在 asio 套接字上设置 no_delay 选项时遇到问题。以下代码运行良好,除了延迟。我的服务器仅在 5000 毫秒过期后才接收消息。

#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? ,我需要在打开 socket 之后但在连接 socket 之前设置选项。所以我试过这个:

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;
}
}

最佳答案

客户端正确设置了 ip::tcp::no_delay 选项。但是,观察到的延迟不是此选项的结果。相反,这是服务器尝试读取比客户端发送的更多数据的结果,当客户端在休眠 5000 毫秒后退出时,服务器的读取操作完成并出错。

read() 服务器启动的操作将在它读取 streambuf.max_size() 时完成字节或发生错误。 streambuf 的最大大小默认为 std::numeric_limits<std::size_t>::max()并且可以在其 constructor 中进行配置.在这种情况下,服务器尝试读取 std::numeric_limits<std::size_t>::max()字节,但客户端只发送 22 个字节,休眠 5000 毫秒,然后关闭套接字。当服务器观察到连接已关闭时,read()操作以读取 22 个字节和错误代码 boost::asio::error::eof 完成.

关于tcp - 设置 ASIO no_delay 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40397351/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com