提升 ASIO SSL 收到的字节数
Boost ASIO SSL number of bytes received
我想使用 Boost ASIO + SSL 创建 client/server 通信程序对。所以我从 boost 提供的例子开始,我了解了它是如何工作的,我几乎准备好开发我的通信协议,除了有一个问题。
所以从this example开始,我在修改握手后的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
收到回复,但(显然?)并非如此
我想使用 Boost ASIO + SSL 创建 client/server 通信程序对。所以我从 boost 提供的例子开始,我了解了它是如何工作的,我几乎准备好开发我的通信协议,除了有一个问题。
所以从this example开始,我在修改握手后的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
收到回复,但(显然?)并非如此