为什么插座会这样?

2024-06-18 11:22:58 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我只是在用python来处理套接字。我发现,根据getsockopt函数,将socket选项sou RECVBUF设置为N会使socket recv缓冲区变大2N字节。例如:

import socket
a, b = socket.socketpair()
a.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 4096)
print a.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) #prints 8192
b.send('1'*5000)
print len(a.recv(5000)) #prints 5000 instead of 4096 or something else.

a.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 8192)
print a.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF) #prints 16384

有人能给我解释一下吗?我正在编写一个HTTP服务器,我想严格限制请求的大小,以保护我宝贵的稀缺内存量。在


Tags: 函数so选项socketprints缓冲区printrecv
1条回答
网友
1楼 · 发布于 2024-06-18 11:22:58

在内部,这是在进行操作系统级操作,根据man 7 socket的说明如下:

所以,你要

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.

从这个奇妙的回答中大量复制了一个稍微不同的问题:https://stackoverflow.com/a/11827867/758446

相关问题 更多 >