繁体   English   中英

Python TCP“发送”套接字缓冲区的大小

[英]Python TCP 'Send' socket buffer size

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

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

我有一些约500字节长的示例数据,转换器转换为bytes对象,并由“客户端”发送到“服务器”:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
...
s.send(sample_data)

尽管我只有一个调用send方法的方法,这是否意味着客户端一次发送40个字节的“ sample_data”,而服务器又一次“请求” 40个字节(只要整个包未完全发送)?

我在这篇文章中发现有一个SO_SNDBUF参数,该参数设置socketsend缓冲区大小,但是它与没有设置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)

TCP是一种流协议,这意味着没有消息边界。 它只是字节流。 将其视为FIFO。 如果客户端发送500个字节,则服务器上总共将接收500个字节。 recv(40)将按发送顺序接收1-40个字节。 您必须检查返回值以查看收到了多少。

您可能会收到以下数据长度:40,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,40,40,15

然后在阻塞的套接字上进行另一个recv(40)将挂起,直到至少接收到一个字节为止;如果客户端关闭套接字,则返回零字节。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM