Python TCP Send socket buffer siz

2024-04-19 05:51:15 发布

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

我想使用TCP Pythonsocket模块发送/接收“分区”数据。 我的接收服务器端socket被设置为在一个recv调用中接收40字节的数据:

while True:
    data = connection.recv(40)
    if not data:
        break
    ...
connection.close()

我有一些大约500字节长的示例数据,转换为bytes对象,由“client”发送到“server”:

^{pr2}$

虽然我只有一次对send方法的调用,但这是否意味着只要整个包没有完全发送,客户端一次发送40字节的“示例数据”,而服务器一次“请求”40字节?在

我发现在this post中有一个SO_SNDBUF参数,它为socket设置send缓冲区的大小,但是它与没有设置SO_SNDBUF的“普通”socket有什么不同?在

buffer_size = 40
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, buffer_size)
...
s.send(sample_data)

Tags: 模块数据send示例datasize字节so
1条回答
网友
1楼 · 发布于 2024-04-19 05:51:15

TCP是一种流协议,这意味着没有消息边界。它只是一个字节流。把它想象成先进先出。如果客户机发送500个字节,那么服务器上总共有500个字节要接收。recv(40)将按发送顺序接收1-40个字节。你必须检查返回值,看看你收到了多少。在

您可以接收的数据长度为:40,40,40,40,40,40,40,40,40,40,40,20

或者你可以收到类似的信息:40,40,5,40,40,40,40,40,40,40,40,40,15

在阻塞套接字上生成另一个recv(40)将挂起,直到至少多收到一个字节,或者如果客户端关闭该套接字,则返回零字节。在

由服务器将数据连接在一起并确定是否接收到完整的数据传输。通常,您需要定义一个协议来决定一个完整的消息需要什么。这可能是“500字节是一个完整的消息”。您还需要处理这样的情况:发送了两条消息,而一条recv可以从一条消息的末尾和另一条消息的开头获取数据。在

通常不需要使用套接字选项调整缓冲区大小。在

相关问题 更多 >