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

斯坦·雷杜特(Stan Redoute)

我想使用TCP Pythonsocket模块发送/接收“部分”数据我的接收服务器端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用于设置的send缓冲区大小参数socket,但是它与“普通”有什么不同,socketSO_SNDBUF没有设置?

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个字节。Arecv(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,一条消息可以从一条消息的末尾到另一条消息的末尾获取数据。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在python中设置套接字的发送缓冲区大小

Python套接字将多个发送的数据放入一个接收缓冲区

通过套接字发送文件 - 缓冲区大小

如何读取套接字缓冲区中的所有可用字节?Python3

Python套接字:使用send()和recv()时有关网络缓冲区的问题

套接字接收缓冲区大小

增加Python的标准缓冲区大小

Python Poster缓冲区大小

复制套接字缓冲区时,使用ctypes的Python数据包嗅探器崩溃

通过TCP套接字发送char缓冲区不完整

Python:通过套接字发送的消息大小

为什么接收到的缓冲区大小比最初通过套接字发送的要大?

Windows中套接字发送缓冲区的大小是多少?

是否有关于通过套接字发送的最大缓冲区大小的指南?

每个流的TCP套接字缓冲区

套接字缓冲区大小未增加

如何找到Linux的套接字缓冲区大小

golang获取udp套接字缓冲区大小

如何获得底层套接字读取缓冲区的大小?

从套接字读取而不知道缓冲区的大小

Windows上的TcpWindowSize vs套接字缓冲区大小

通过Python中的TCP套接字发送文件

Python套接字将数据追加到发送的字节(TCP)

在 Python 中通过 TCP 套接字发送列表

将协议缓冲区编码的消息从Python Server发送到Java客户端

通过协议缓冲区将 0 字节值从 c++ 发送到 python

在Android中通过套接字发送1 MB数据缓冲区

使用Delphi中的套接字使用缓冲区发送/接收文本

Linux可以将哪些值用于默认的unix套接字缓冲区大小?