c++ - 在 Boost::asio 中使用套接字类的成员函数或公共(public)函数?

标签 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,***);

最佳答案

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] 中没有出现错误,您就知道所有数据都已发送。

关于c++ - 在 Boost::asio 中使用套接字类的成员函数或公共(public)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53404250/

相关文章:

C++随机数srand

c++ - 如何让两个多播套接字监听具有相同端口的两个多播 channel

sockets - C : what do I get? 中的非阻塞 udp 套接字编程

java - 读取套接字输入流而没有传输结束字符?

c++ - 如何将有向图(邻接表)传递给 Dijkstra 算法 boost 以找到最短路径?

c++ - 是否有任何应用程序具有 HWND?

c++ - 如何通过 C++ 标准类型特征切换传递的值?

c++ - 添加派生类导致ghost错误

python - 通过boost python从python中提取常量值

c++ - 如何更改 dynamic_bitset 的值?