增加接收到的ASIO SSL字节数
Boost ASIO SSL number of bytes received
我想使用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
收到回复,而
相关文章:
- 提升 Asio SSL 无法第二次接收数据(第一次确定)
- C++ 关闭Boost ASIO SSL套接字的最佳方法是什么?
- 使用 asio+ssl,async_write不会发送数据
- 提升 ASIO SSL 写入部分数据
- 用于 asio SSL 上下文的单个证书
- 为什么没有asio::ssl::iostream?(以及如何实施)
- 从或写入boost :: asio :: ssl :: stream :: next_layer()旁路SSL解密/加密
- 提升/ASIO/SSL 抛出"undefined reference"错误
- 使用 boost::asio SSL 服务器减少每个连接的内存使用量
- boost::asio::ssl::context::context(boost::asic::ssl::context
- 在同一系统上运行的多个boost::asio-ssl客户端
- 提升 asio ssl:如果私钥传递上下文::use_private_key,则不调用密码回调
- 提升 asio - SSL async_read,从一个线程async_write
- boost::asio-ssl链接错误
- Boost ASIO:SSL握手()永远不会结束
- Boost的ASIO + SSL在某些情况下不起作用
- 可以在多个ssl流之间共享boost::asio::ssl::上下文
- Boost asio & ssl & error code
- boost asio SSL async_shutdown总是以错误结束
- 如何修改boost::asio::ssl::context的方法