2

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

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

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

4

1 回答 1

2

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

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

于 2012-11-20T16:48:47.540 回答