使用套接字类的成员函数还是Boost :: asio中的通用函数?

时间:2018-11-21 01:52:29

标签: c++ sockets boost boost-asio

我正在学习Boost :: asio套接字;我看到了一些examples,他们在其中使用套接字类的成员函数来读取和接收消息,或使用boost :: asio通用函数将套接字作为第一个参数传递。

所以我想知道两种方法之间的区别是什么?谢谢!

//one kind
tcp::socket sock;
sock.async_write_some(***);

//another kind
boost::asio::async_write(socket,***);

1 个答案:

答案 0 :(得分:1)

async_write作为静态函数可确保缓冲区中的所有数据 在此函数返回之前编写。

async_write_some作为函数成员保证至少一个字节 在该函数结束之前从缓冲区写入。

因此,如果您想使用async_write_some,则需要提供更多代码 处理并非所有缓冲区数据都被写入的情况。

假设您有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_write_some 要发送其余数据,依此类推,您的回调可能会被多次调用。

使用async_write更简单:

string str; // add 10 bytes
async_write (buffer(str.c_str(),SIZE),makeCallback());

void callback() {
  // check errors
  [1]
}

如果[1]中没有发生错误,则说明所有数据都已发送。