我试图找出/调整网络缓冲区的大小:
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数据包的大小..甚至找到它?
答案 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是什么?先进入 - 当缓冲区饱和时首先丢弃?
据我所知,缓冲区是否已完全接收将失败。它不会丢弃已收到但未处理的数据,以便为新数据腾出空间。