Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于boost::asio套接字和阻塞_C++_Sockets_Boost_Boost Asio - Fatal编程技术网

C++ 关于boost::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并测试了阻塞回音示例。他们似乎没有完全阻止它。至少不像我想象的那样

有没有可能摆脱任何类型的缓冲,或者你能拥有的最小缓冲大小是多少?看起来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在幕后的处理方式有所不同,那也没关系。我只是好奇而已。