用于在Python中读取UDP数据包的缓冲区大小

时间:2015-02-17 14:20:20

标签: python sockets udp

我试图找出/调整网络缓冲区的大小:

import socket

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)
212992

这究竟是什么? ~0.2 MBytes ..!?

但是,如果我在其他地方寻找缓冲区大小,即在命令行上:

sampsa@sampsa-xps13:~/python/sockets$ cat /proc/sys/net/ipv4/tcp_wmem
4096    16384   4194304

..我得到4096字节。

让我们尝试设置缓冲区大小,然后检查其值:

sock.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF,1024)

sock.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)     
2304

发生了什么?

用SOL_UDP替换SOL_SOCKET会导致"协议不可用"

如何调整最大值? UDP数据包的大小..甚至找到它?

1 个答案:

答案 0 :(得分:1)

  

我想说,如何找出/调整缓冲区的大小

您使用SO_RCVBUF的方式是正确的。但请注意,根据您的设置和操作系统,您可能会使用getsockopt获得与使用setsockopt设置的值不同的值。在Linux socket(7)上声明:

SO_RCVBUF
Sets or gets the maximum socket receive buffer in bytes.  The kernel doubles
this value (to allow space for bookkeeping overhead) when it is set using 
setsockopt(2), and this doubled  value  is  returned  by  getsockopt(2). 
The default value is set by the /proc/sys/net/core/rmem_default file, and
the maximum allowed value is set by the /proc/sys/net/core/rmem_max file.  
The minimum (doubled) value for this option is 256.
  

而且,顺便说一下,网络套接字FIFO是什么?先进入 - 当缓冲区饱和时首先丢弃?

据我所知,缓冲区是否已完全接收将失败。它不会丢弃已收到但未处理的数据,以便为新数据腾出空间。