簡體   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