C++ 是否在Boost::asio中使用套接字类的成员函数或公共函数?
我正在学习Boost::asio套接字;我看到了一些,其中他们使用socket类的成员函数来读取和接收消息,或者使用boost::asio common函数来传递socket作为第一个参数 所以我想知道这两种方法之间的区别是什么?谢谢C++ 是否在Boost::asio中使用套接字类的成员函数或公共函数?,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,我正在学习Boost::asio套接字;我看到了一些,其中他们使用socket类的成员函数来读取和接收消息,或者使用boost::asio common函数来传递socket作为第一个参数 所以我想知道这两种方法之间的区别是什么?谢谢 //one kind tcp::socket sock; sock.async_write_some(***); //another kind boost::asio::async_write(socket,***); async\u writeas静态函数保
//one kind
tcp::socket sock;
sock.async_write_some(***);
//another kind
boost::asio::async_write(socket,***);
async\u write
as静态函数保证缓冲区中的所有数据
在该函数返回之前写入
async\u write\u some
作为函数成员保证至少有一个字节
在该函数结束之前从缓冲区写入
因此,如果你想使用async\u编写一些,你需要提供更多的代码
处理缓冲区中并非所有数据都已写入的情况
假设您有10个字节的字符串,它是您的缓冲区,您希望确保
所有缓冲区均已发送:
// Pseudocode:
string str;
// add 10 bytes to str
SIZE = 10;
int writtenBytes = 0;
socket.async_write_some (buffer(str.c_str(),SIZE), makeCallback());
void callback (
error_code ec,
size_t transferredBytes)
{
// check errors
// [1]
writtenBytes += transferredBytes;
if (writtenBytes == SIZE)
return;
// call async_write_some
socket.async_write_some (buffer(str.c_str()+writtenBytes,SIZE-writtenBytes),makeCallback());
}
在回调[1]中,您需要检查写入了多少字节,
如果结果与SIZE
不同,则需要再次调用async\u write\u some
要发送剩余的数据等,可能会多次调用回调
async\u write
的使用更简单:
string str; // add 10 bytes
async_write (buffer(str.c_str(),SIZE),makeCallback());
void callback() {
// check errors
[1]
}
如果[1]
中没有发生错误,您就知道所有数据都已发送。非常感谢,根据您的回答,异步写入函数似乎是一个不错的选择,但是异步写入部分
和异步读取部分
的存在意义是什么?嗯,问得好。Boost Asio是实现berkeley套接字的API的包装器,例如,在linux下,您可以使用recv
函数,该函数也不能保证接收到所有缓冲区,它返回的字节数比作为参数传递的要少。因此,async\u read\u一些
遵循这样的行为。