为什么不在tcp的情况下重用消息缓冲区

时间:2012-11-20 15:37:43

标签: c tcp

我已经看到许多开源框架和tcp / ip的最佳实践建议永远不要重复使用已交给tcp层进行传输的缓冲区。它背后的原因是什么?缓冲区是否真的被复制到内核中是不正确的,那么关于不重用缓冲区的parnaoia是什么? 上面的典型例子是

char data[1024] = {'1', '2'.................'1024'};
write(socket, data, 1024);
data = {'a', 'b','c'...........};  //reusing the buffer 

ZeroMQ提供api来创建缓冲区并删除它,强烈建议不要使用它。 Netperf创建一个ringbuffer并确保它永远不会重用当前写入套接字的缓冲区。

1 个答案:

答案 0 :(得分:2)

write()send()都会将您的数据复制到TCP“发送窗口”,这样您就不必担心在这些调用之后在程序中更改它。但请注意,非阻塞套接字可能无法复制所有您的数据,因此您应该检查返回代码以找出实际写入的字节数。

有些自定义TCP堆栈(可能用于非常小的嵌入式系统)可能需要数据保留,但主流操作系统不需要这样。