Tcp 设置ASIO无延迟选项

Tcp 设置ASIO无延迟选项,tcp,boost-asio,Tcp,Boost Asio,在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

在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));
}
但是,这会抛出
set\u选项:错误的文件描述符

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));
}
然而,在这种情况下,该选项没有效果,我仍然看到延迟。根据,我需要在打开插座后但在连接插座之前设置该选项。所以我试过这个:

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;
    }
}
#包括
#包括
int main(){
boost::asio::io_服务io_服务;
boost::asio::ip::tcp::acceptor acceptor(io_服务,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),32323));
boost::asio::ip::tcp::socket套接字(io_服务);
接受(套接字);
set_选项(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客户端正在正确设置该选项。但是,观察到的延迟不是此选项的结果。相反,它是服务器尝试读取的数据多于客户端发送的数据的结果,并且当客户端在睡眠5000ms后退出时,服务器的读取操作将以错误完成


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

服务器是否也设置了
无延迟
选项?感谢您的回复。我没有在服务器端设置它。我想我现在正在设置,但仍然看不到效果。我编辑了原始帖子以包含服务r代码。这很有意义。我刚刚通读了一遍,试图弄清楚他们为什么在数据的第一个字节发送缓冲区大小。这就解释了。谢谢你提供的信息。
#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;
    }
}