小编Rad*_*oet的帖子

Boost asio tcp socket可用报告错误的字节数

在SSL客户端服务器模型中,我使用下面的代码从客户端或服务器端的套接字读取数据.

我只在有可用数据时读取数据.要知道,当有可用的数据,我检查available()的方法lowest_layer()asio::ssl::stream.在我从客户端向服务器发送380个字节并在服务器上输入read方法后,我看到以下内容.

's'是我提供的缓冲区.
'n'是我提供的缓冲区的大小.
'a1'是读取之前的available()的结果,将报告458个字节.
'r'是实际读取的字节数.它将报告380,这是正确的.
'a2'是读取后的available()的结果,将报告0字节.这是我所期望的,因为我的客户端发送了380个字节,而且我已经读完了所有内容.

为什么第一次调用available()报告太多字节?

类型:

/**
 * Type used as SSL Socket. Handles SSL and socket functionality.
 */
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SslSocket;
/**
 * A shared pointer version of the SSL Socket type.
 */
typedef boost::shared_ptr<SslSocket>                           ShpSslSocket;
Run Code Online (Sandbox Code Playgroud)

成员:

ShpSslSocket                     m_shpSecureSocket; 
Run Code Online (Sandbox Code Playgroud)

部分读取方法:

std::size_t a1 = 0;
if ((a1 = m_shpSecureSocket->lowest_layer().available()) > 0)
{
   r += boost::asio::read(*m_shpSecureSocket,
                          boost::asio::buffer(s, n),
                          boost::asio::transfer_at_least(1));
}

std::size_t a2 = m_shpSecureSocket->lowest_layer().available();
Run Code Online (Sandbox Code Playgroud)

补充信息:

所以我改变了我的read方法,以便更彻底地检查是否还有可以从boost :: asio :: ssl …

c++ boost boost-asio

6
推荐指数
1
解决办法
1178
查看次数

标签 统计

boost ×1

boost-asio ×1

c++ ×1