繁体   English   中英

boost asio套接字异步读取方法将阻塞,直到收到换行符为止

[英]boost asio socket async read methods block until a newline is received

我(实际上)正在编写类似于telnet的应用程序。 (这要复杂得多。)我需要接收入站IP连接并传输数据。 我正在使用boost :: asio来完成套接字工作。

一切都很好,除非我无法说服asio在数据可用时立即调用我的处理程序。 为了进行测试,我通过telnet到主机/端口(正在工作),键入内容,然后按换行键。 我的调试输出出现。 那很棒。

如果我不换行,则我的应用程序处于安静状态。 我不妨只是打电话给“ readline”。

我已经尝试了多种方法。 我尝试做async_read_until,传递了一种方法,该方法在有任何数据时返回一对。 直到换行符才调用它。

我尝试将async_read与1字节缓冲区一起使用。 在适当的时候,它被调用了n次,但是只有在终端上我按换行符时才被调用。

就此而言,telnet在键入时回显了字符,这似乎也有提示作用。

这是使用async_read_until的代码:

boost::asio::async_read_until(socket, receiveBuffer, haveData,
        boost::bind(&TCPConnection::dataReceived,
              shared_from_this(),
              boost::asio::placeholders::error));

std::pair<TCPConnection::Iterator, bool>
haveData(TCPConnection::Iterator begin, TCPConnection::Iterator end)
{
    if (begin != end) {
        return std::make_pair(end, true);
    }
    // no data.
    return std::make_pair(begin, false);
}

以下是使用1字节缓冲区的代码:

char * buffer = new char(1);

auto hPtr = boost::bind(&TCPConnection::handler,
        shared_from_this(), boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred);
boost::asio::async_read(socket, boost::asio::buffer(buffer, 1), hPtr);

我的套接字定义:

boost::asio::ip::tcp::socket socket(io_service);

我想(以某种方式)我需要使套接字进入不同于它所在的模式。我不知道如何。

公平地说,我讨厌1字节缓冲区的东西。 我宁愿给它一个适当的大小缓冲区,但要等到有任何数据后再给我它的内容。 但是,如果我必须一次读取1个字节,我可以接受。

好吧,考虑这个答案。 这不是我的程序。 是telnet,默认情况下处于线路模式。 请参阅丹尼尔的问题和我对原始帖子的评论中的回复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM