首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >socket.recv(recv_size)什么时候回来?

socket.recv(recv_size)什么时候回来?
EN

Stack Overflow用户
提问于 2011-08-24 11:49:51
回答 3查看 168.5K关注 0票数 64

通过测试,我得出结论,在接下来的三种情况下,socket.recv(recv_size)将返回。

  1. 在连接被关闭之后。例如,客户端名为socket.close()或发生任何套接字错误,它将返回空字符串。
  2. 有的数据来了,数据的大小比recv_size还要大。
  3. 一些数据来了,数据的大小小于recv_size,在短时间内没有更多的数据(我发现0.1s可以工作)。

关于#3的更多细节:

代码语言:javascript
复制
#server.py

while True:
    data = sock.recv(10)
    print data, 'EOF'

#client1.py

sock.sendall("12345")
sock.sendall("a" * 50)

#client2.py

sock.sendall("12345")
time.sleep(0.1)
sock.sendall("a" * 50)

当我运行client1.py时,server.py回显如下:

代码语言:javascript
复制
12345aaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaa EOF

当我运行client2.py时,server.py回显如下:

代码语言:javascript
复制
12345 EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF
aaaaaaaaaa EOF

我的结论正确吗?我在哪里能看到关于#3的官方描述?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-24 18:49:01

是的,你的结论是正确的。socket.recv是一个阻塞呼叫。

socket.recv(1024)最多读取1024字节,如果没有等待读取的数据,则会阻塞。如果不读取所有数据,则对socket.recv的其他调用不会阻塞。

如果连接关闭或出现错误,socket.recv也将以空字符串结尾。

如果您想要一个非阻塞的套接字,您可以使用select模块(比仅仅使用套接字要复杂一些),或者可以使用socket.setblocking

过去我和socket.setblocking有过问题,但是如果你愿意的话,可以随意尝试一下。

票数 42
EN

Stack Overflow用户

发布于 2011-08-24 18:34:40

它将具有与底层recv调用相同的行为--参见手册页获得行为的官方描述(或阅读更多的套接字api的一般描述 )。

票数 4
EN

Stack Overflow用户

发布于 2019-04-05 02:53:59

我认为你的结论是正确的,但不准确。

正如文档所指出的,socket.recv主要集中在网络缓冲区上。

当套接字被阻塞时,只要网络缓冲区有字节,socket.recv就会返回。如果网络缓冲区中的字节超过socket.recv所能处理的字节数,它将返回它能够处理的最大字节数。如果网络缓冲区中的字节少于socket.recv所能处理的字节,它将返回网络缓冲区中的所有字节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7174927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档