Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否在Boost::asio中使用套接字类的成员函数或公共函数?_C++_Sockets_Boost_Boost Asio - Fatal编程技术网

C++ 是否在Boost::asio中使用套接字类的成员函数或公共函数?

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静态函数保

我正在学习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 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一些
遵循这样的行为。