我已经看到许多开源框架和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并确保它永远不会重用当前写入套接字的缓冲区。
答案 0 :(得分:2)
write()
和send()
都会将您的数据复制到TCP“发送窗口”,这样您就不必担心在这些调用之后在程序中更改它。但请注意,非阻塞套接字可能无法复制所有您的数据,因此您应该检查返回代码以找出实际写入的字节数。
有些自定义TCP堆栈(可能用于非常小的嵌入式系统)可能需要数据保留,但主流操作系统不需要这样。