[英]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
参数,该参数设置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)
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.