[英]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.