- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 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/
我在 asio 套接字上设置 no_delay 选项时遇到问题。以下代码运行良好,除了延迟。我的服务器仅在 5000 毫秒过期后才接收消息。 #include #include using nam
我正在尝试使用同一问题的答案禁用 Nagle 算法:ASIO ip::tcp::iostream and TCP_NODELAY : boost::asio::ip::tcp::iostrea
我所知道的... 根据 https://stackoverflow.com/a/25871250,我需要在 connect() 之前调用 set_option(tcp::no_delay(true))
我是一名优秀的程序员,十分优秀!