为什么套接字的行为如此?

时间:2014-05-23 22:16:46

标签: python sockets

所以我只是在使用python中的套接字。根据getsockopt函数,我发现将套接字选项SO_RECVBUF设置为N会使套接字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服务器,我想严格限制请求的大小,以保护我珍贵的RAM。

1 个答案:

答案 0 :(得分:5)

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

SO_RCVBUF

  

以字节为单位设置或获取最大套接字接收缓冲区。 *当使用setsockopt(2)设置时,内核将此值加倍(以便为簿记开销留出空间),并且getsockopt(2)返回此doubled值。**默认值由/ proc / sys /设置net / core / rmem_default文件,最大允许值由/ proc / sys / net / core / rmem_max文件设置。此选项的最小(加倍)值为256。

从这个精彩的答案中巧妙地复制到一个稍微不同的问题:https://stackoverflow.com/a/11827867/758446