boost asio socket async read方法阻塞,直到收到换行符

时间:2018-04-13 19:08:21

标签: c++ boost-asio

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

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

如果我没有按换行,我的应用程序很安静。我不妨只是称之为“readline”。

我尝试过各种各样的事情。我尝试做async_read_until,传递一个方法,当有任何数据时返回一对。直到换行才会调用它。

我尝试使用带有1字节缓冲区的async_read。它会在适当时调用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个字节,我可以忍受它。

1 个答案:

答案 0 :(得分:0)

好的,考虑一下这个问题。这不是我的计划。它是telnet,默认情况下是在线模式。请参阅丹尼尔的问题以及我对原始帖子的评论中的回答。