我(实际上)正在编写一个类似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个字节,我可以忍受它。
答案 0 :(得分:0)
好的,考虑一下这个问题。这不是我的计划。它是telnet,默认情况下是在线模式。请参阅丹尼尔的问题以及我对原始帖子的评论中的回答。