不知道这是不是该问的地方,但我要说的是...
我在linux中实现了一个使用普通套接字的UDP客户机/服务器。
(假设这两台主机之间的网络端没有以任何方式干扰数据包,但只需按原样传递)
内核是否对这些UDP数据包进行了任何类型的缓存/优化(它与我每次发送的数据包完全相同)
我正在做一些测试,在客户机/服务器之间“乒乓”不同大小的数据包,想知道我是否需要每次都用随机数据填充数据包,或者我是否可以一直发送这个“固定内容”数据包?(每次测试的数据包大小都保持不变)。
发布于 2010-06-09 20:36:41
除非设置了BPF (Berkeley Packet Filter,伯克利数据包过滤器)或等效的(即防火墙)来检查流量并可能对其进行更改,否则堆栈应该不会察觉到数据报中的有效负载。您应该能够再次使用相同的数据包。
发布于 2010-06-18 22:03:29
正如armardeep所说,堆栈并不知道有效负载。防火墙通常不会修改数据报,它们允许它们通过或完全阻止它们。
内核不会“缓存”包,但会对它们进行缓冲。至少有一个输出缓冲区和一个输入缓冲区,其中包在其中结束,直到网络线路空闲;输入缓冲区中存储接收到的包,直到您的代码调用recv方法。
实际上,流水线中可能会有更多的缓冲区,但从应用程序的角度来看,内核的行为就好像只有这两个缓冲区一样。顺便说一句,这两个都可能溢出。
发布于 2010-06-22 05:16:50
有一个与套接字相关联的内核缓冲区,在调用recv之前,包一直存储在该套接字中。如果内核接收数据的速度快于您从套接字缓冲区中删除数据的速度,则会发生溢出,并且内核将静默地丢弃您的数据包。您可以使用对setsockopt的调用来增加该特定套接字的接收缓冲区的大小。
int rcvbuflen = 0x20000; // 128kb
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuflen, sizeof(rcvbuflen));您可以使用getsockopt检查缓冲区的当前大小。
https://stackoverflow.com/questions/3005714
复制相似问题