C++ 关于boost::asio套接字和阻塞
所以我尝试了boost::asio并测试了阻塞回音示例。他们似乎没有完全阻止它。至少不像我想象的那样 有没有可能摆脱任何类型的缓冲,或者你能拥有的最小缓冲大小是多少?看起来10000字节太小了 下面的代码在阻塞之前运行了2次写入。如果我将boost::asio::transfer_正好(10000)参数添加到write中,它仍然是2。boost::asio::transfer_正好(5000)得到5次写入 那么这个网络/io/asio的东西是如何工作的呢?就像我只想发送一个字节,然后等待它到达另一端,而不需要任何额外的通信 服务器:C++ 关于boost::asio套接字和阻塞,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,所以我尝试了boost::asio并测试了阻塞回音示例。他们似乎没有完全阻止它。至少不像我想象的那样 有没有可能摆脱任何类型的缓冲,或者你能拥有的最小缓冲大小是多少?看起来10000字节太小了 下面的代码在阻塞之前运行了2次写入。如果我将boost::asio::transfer_正好(10000)参数添加到write中,它仍然是2。boost::asio::transfer_正好(5000)得到5次写入 那么这个网络/io/asio的东西是如何工作的呢?就像我只想发送一个字节,然后等待它到达另
boost::asio::io_service io_service;
tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), 12346));
tcp::socket sock(io_service);
a.accept(sock);
sock.non_blocking(false);
boost::asio::socket_base::send_buffer_size option(10000);
sock.set_option(option);
while(true) {
char data[10000];
boost::asio::socket_base::bytes_readable bytes_readable_cmd(true);
sock.io_control(bytes_readable_cmd);
std::size_t bytes_readable = bytes_readable_cmd.get();
if(bytes_readable) {
/**/
}
boost::asio::write(sock, boost::asio::buffer(data, 10000));
printf("#\n");Sleep(10);
}
客户:
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(tcp::v4(), "localhost", "12346");
tcp::resolver::iterator iterator = resolver.resolve(query);
tcp::socket sock(io_service);
boost::asio::connect(sock, iterator);
sock.non_blocking(false);
我认为在这种情况下,
write
实际上只在底层缓冲区已满时才会阻塞
以下引用适用于:
成功完成发送功能并不表示数据已成功发送和接收给收件人。此函数仅表示数据已成功发送
如果传输系统中没有可用的缓冲空间来保存要传输的数据,则除非套接字处于非阻塞模式,否则send将阻塞
我试着写超过64KB的内容(从65537开始),但在第一次调用时就被阻止了
这不是Asio的工作方式,而是TCP和套接字的工作方式。这可能也有帮助
我想您需要明确地从客户端发送接收确认,即滚动您自己的应用层协议。为什么要发送数据并等待另一端接收到数据?假设我不关心接收方程序是否实际获得了数据并对其进行了处理。我只想要TCP协议提供给我的东西。因此,我预期asio的“发送”/“写入”块将一直持续到接收器调用“recv”。如果asio在幕后的处理方式有所不同,那也没关系。我只是好奇而已。