asio :: async_write处理程序在3秒后被调用

时间:2017-04-19 16:01:20

标签: c++ boost-asio

我多年来一直在使用boost :: asio套接字库。但是,我遇到了一个奇怪的问题。我有一个不断向另一个进程发送数据的类。它从队列中读取,并将其发送到队列变空。我已从以下示例中删除了所有这些细节以保持简单。函数socket_write调用asio :: async_write,它在完成时调用writeHandler。我从处理程序再次调用socket_write函数。这在低音量下完美无瑕。

然而,在高音量时,事情变得奇怪。首先,程序设法每秒执行100个socket_write操作循环。大约一分钟后,writeHandler不会返回3秒。一旦它回来,另外100个循环在一秒钟内完成。然后,writeHandler再也没有返回3秒。一旦回来,另外100个周期拉开。

我很沮丧!什么可以使writeHandler每秒返回100次,然后是3秒的延迟,然后回到每秒100次,然后是3秒延迟?一旦开始,这是一致的模式。数据量不是太高,每次写操作都不会发送超过几百个字节。我也在接收服务器上定时读取操作,读取时间不会超过几毫秒。延迟仅在写操作中。

class myclass
{
public:
    // other stuff
    void socket_write()
    {
        boost::asio::async_write(_socket,boost::asio::buffer(_writeVector),
            boost::bind(&this_type::writeHandler, shared_from_this(),
            pSession,boost::asio::placeholders::bytes_transferred,
            boost::asio::placeholders::error));
    }
    void writeHandler(boost::shared_ptr<MessageSession> pSession, size_t bytesWritten, const boost::system::error_code& ec)
    {
          // stuff
        socket_write();   // Call the socket_write function again.
    }
};

1 个答案:

答案 0 :(得分:1)

在考虑了一段时间之后,我决定看看它是否是缓冲限制问题。所以我查了发送缓冲区大小,它是64K。所以我把它改成1MB。

~/.aws/credentials

解决!!!没有更多的延迟。