作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我在 TCP 套接字上发送数据,以数据大小为前缀,如下所示:
write(socket, &length, sizeof(length));
write(socket, data, length);
(注意:我有Unix Network Programming书中描述的wrapper writen函数,并且正在检查错误等。以上只是为了这个问题的简单性)。
现在,我的经验是将数据分解为多个写入可能会导致速度显着下降。我通过创建自己的缓冲区,然后发送一大块,成功地加快了速度。
但是,在上述情况下,数据可能非常大(比如说 1 Gig)。我不想创建一个 1 Gig 大 + 4 字节的缓冲区,只是为了能够进行一次 write() 调用。有什么方法可以做类似于:
write(socket, &length, data, sizeof(length) + length)
无需提前支付大量内存分配的代价?我想我可以预先分配一个写入缓冲区大小的 block ,并连续发送它(下面的代码有错误,即在某些情况下应该发送 &chunk + 4 ,但这只是想法):
length += 4;
char chunk[buffer_size];
var total = 0;
while (total < length)
{
if (total < 4)
{
memcpy(&chunk, &length, 4);
total += 4;
}
memcpy(&chunk, data + total, min(buffer_size, length - total));
write(sock, &chunk, min(buffer_size, length - total));
total += min(buffer_size, length - total);
}
但在那种情况下,我不知道写入缓冲区的实际大小是多少(是否有 API 可以获取它?)我也不知道这是否是合适的解决方案。
最佳答案
已经有一个选项可以做到这一点。它将通知您的网络层您将要发送更多数据并且您希望缓冲而不是尽快发送。
setsockopt(sock_descriptor, IPPROTO_TCP, TCP_CORK, (char *)&val, sizeof(val));
val 是一个整数,应该是 0 或 1,打开“软木塞”,你的网络层将尽可能多地缓冲东西,只发送完整的数据包,你可能想要“弹出软木塞”和“再次软木塞”以处理您需要在套接字上进行的下一批传输。
你的想法是正确的,这只是省去了你实现它的麻烦,因为它已经在网络堆栈中完成了。
关于c - 写入框架数据而无需额外的 write() 成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29497566/
我是一名优秀的程序员,十分优秀!