增加接收到的ASIO SSL字节数

Boost ASIO SSL number of bytes received

本文关键字:ASIO SSL 字节数 增加      更新时间:2023-10-16

我想使用Boost ASIO+SSL创建客户端/服务器通信程序对。所以我从boost提供的例子开始,我了解了它是如何工作的,我几乎已经准备好开发我的通信协议了,只是有一个问题。

因此,从这个例子开始,我将修改握手后的handle_read()回调函数。以下是我的代码。我唯一的修改是:添加另一个回调函数startComm(),它将启动通信。

void handle_read(const boost::system::error_code& error,
                 size_t bytes_transferred)
{
    if (!error)
    {
        std::cout << "Reply: ";
        std::cout.write(reply_, bytes_transferred);
        std::cout << "n";
        boost::asio::async_write(socket_,
                                 boost::asio::buffer(std::string("Now?")),
                                 boost::bind(&SSLClient::startComm, this,
                                             boost::asio::placeholders::error,
                                             boost::asio::placeholders::bytes_transferred));
    }
    else
    {
        std::cout << "Read failed: " << error.message() << "n";
    }
}
void startComm(const boost::system::error_code& error,
                 size_t bytes_transferred)
{
    if (!error)
    {
        std::cout << "Reply: ";
        std::cout.write(reply_, bytes_transferred); //problem here, bytes transferred should contain the number of received chars not number of written chars
        std::cout << "n";
    }
    else
    {
        std::cout << "Read failed: " << error.message() << "n";
    }

}

在上面的async_write()中,有一个参数boost::asio::placeholders::bytes_transferred,它将我的回调函数参数化,以提供发送到服务器的字节数。现在我想知道服务器用响应的字节数。在我的简单示例中,我该如何做到这一点?

谢谢。如果您需要任何其他详细信息,请询问。

write调用发送数据。

由于根本不接收数据,因此接收的字节数定义为0。

如果您想接收数据,请使用(async_)read,它会告诉您接收的字节数

这些回调使用相同的占位符bytes_transferred),但根据已完成的传输方向,它具有不同的含义。

这里有一个解决方案,在技术上可以实现您想要的功能:定义startComm的额外参数并将其绑定(不使用占位符)。

void handle_read(const boost::system::error_code &error, size_t bytes_received) {
    if (!error) {
        std::cout << "Reply: ";
        std::cout.write(reply_, bytes_received);
        std::cout << "n";
        boost::asio::async_write(socket_, boost::asio::buffer(std::string("Now?")),
                                 boost::bind(&SSLClient::startComm, 
                                     this, 
                                     boost::asio::placeholders::error,
                                     bytes_received,
                                     boost::asio::placeholders::bytes_transferred));
    } else {
        std::cout << "Read failed: " << error.message() << "n";
    }
}
void startComm(const boost::system::error_code &error, size_t had_received, size_t bytes_sent) {
    if (!error) {
        std::cout << "Reply: ";
        std::cout.write(reply_, had_received);
        std::cout << "n";
    } else {
        std::cout << "Write failed: " << error.message() << "n";
    }
}

请注意,我仍然认为您可能会错误地期望async_write收到回复,而

的情况并非如此