提升Asio问题,Server-Client,在真实网络上慢?

时间:2010-09-07 12:15:32

标签: c++ boost boost-asio

我使用Boost Asio创建了一个客户端 - 服务器架构。

整个过程都有效,我可以发送和接收消息等,所以毫无疑问是正确的。但是,当我在一个真实的网络中实现它时,它突然变得非常慢。当我在同一台计算机上运行服务器和客户端时,它的速度非常快,但是当我在2台不同的计算机上运行它时,速度变得非常慢,我必须等待每一条消息。这些消息最小可能是50个,最多60个字符。它们会被正确发送。

代码:

stream = new tcp::iostream(serverIp, portNum); // Clientside

对于发送和接收,我使用:

(*stream) << data << delimiter;
std::getline(*stream, response, '#');

服务器使用相同的内容进行发送和接收,以及一些用于设置连接的设置代码:

boost::asio::io_service io_service;

tcp::endpoint endpoint(tcp::v4(), portNum); 
tcp::acceptor acceptor(io_service, endpoint);

for (;;)
{
    tcp::iostream *stream = new tcp::iostream();
    acceptor.accept(*(stream->rdbuf()));

    // Do stuff with the stream
}

同样,它在一个真实的网络上突然变得非常缓慢。有什么我做错了吗?我试过更改portNum,没用。还有什么我能做的吗?

3 个答案:

答案 0 :(得分:2)

如果这是您的发送/接收代码的总和,那么似乎花费大量时间等待发送方和接收方在&lt;&lt;之前同步。和getline调用完成。当引入真实的网络连接时,这种效果将被大大放大。它可能看起来在本地快速,但在假定这之前在本地测量字节吞吐量。通常,您不会将发送和接收处理紧密耦合在一起 - 您基本上采用异步I / O库并强制执行同步。尝试重新实现以实际使用异步I / O,并将发送和接收处理彼此分离(或者至少不要像使用同步更高级别的I / O调用来访问套接字那样将它们序列化)并且网络上的性能应该提高

答案 1 :(得分:0)

准备要脱机发送的数据,然后使用async_write写入数据。从带有async_read的socked中读取数据。这些是非阻塞操作,因此可能会对服务器端产生重大影响。

答案 2 :(得分:0)

可能无法修复它,但值得一试 - 在发送消息后更改客户端以刷新流:

  (*stream) << data << delimiter << std::flush;