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

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

我(实际上)正在编写一个类似 telnet 的应用程序。 (远比这复杂。)我需要接收入站 IP 连接并传输数据。我正在使用 boost::asio 进行套接字工作。

一切都很好,除了我无法说服 asio 在数据可用时调用我的处理程序。为了测试,我远程登录到我的 host/port(正在运行),输入一些内容,然后点击换行符。出现我的调试输出。太好了。

如果我不按换行符,我的应用程序就会安静。我还不如打电话给 "readline".

我尝试了很多东西。我尝试做 async_read_until,当有任何数据时,传递一个 returns 一对的方法。直到换行符才会被调用。

我尝试将 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,默认情况下处于线路模式。请参阅 Daniel 的问题和我在对原始 post 的评论中的回复。