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

为什么不在tcp情况下重用消息缓冲区,c,tcp,C,Tcp,我已经看到,许多tcp/ip的开源框架和最佳实践建议永远不要重用已交给tcp层进行传输的缓冲区。背后的原因是什么?缓冲区只是被复制到内核中,这不是真的吗?那么不重用缓冲区的原则是什么呢? 上面的一个典型例子是 char data[1024] = {'1', '2'.................'1024'}; write(socket, data, 1024); data = {'a', 'b','c'...........}; //reusing the buffer ZeroMQ提

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

char data[1024] = {'1', '2'.................'1024'};
write(socket, data, 1024);
data = {'a', 'b','c'...........};  //reusing the buffer 
ZeroMQ提供了创建和删除缓冲区的api,他们强烈建议不要使用它。Netperf创建一个ringbuffer,并确保它从不重用当前写入套接字的缓冲区

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


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

您能更具体一点,在完成的地方复制粘贴一个片段,并提供一个建议的替代方案吗?我目前唯一的猜测是,这可能是在预期API的情况下完成的。这完全取决于您使用的接口。如果上面写的代码被破坏了,那么很多程序都被破坏了。调用write()后,保留缓冲区的唯一原因是如果write无法写入所有数据,您必须再次调用它。我在20多年的网络编程中从未见过这种毫无意义的建议。你在哪里读的?