gpt4 book ai didi

python - `sock.recv()` 当连接在非阻塞套接字上死亡时返回空字符串

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:05 24 4
gpt4 key购买 nike

我在 Python 中有一个名为 sock 的非阻塞套接字。根据我的理解,如果连接已被对等方关闭,recv() 方法应该引发异常,但它返回一个空字符串 ('') 而我不不知道为什么。

这是我测试的脚本(来自 here ):

import sys
import socket
import fcntl, os
import errno
from time import sleep

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1',9999))
fcntl.fcntl(s, fcntl.F_SETFL, os.O_NONBLOCK)

while True:
try:
msg = s.recv(4096)
print("got data '{msg}'".format(msg=msg))
except socket.error, e:
err = e.args[0]
if err == errno.EAGAIN or err == errno.EWOULDBLOCK:
sleep(1)
print 'No data available'
continue
sys.exit(1)

如果对等方关闭连接,此套接字应该在 recv() 上引发 socket.error,但它只会返回 ''.

我是这样测试的,使用两个终端:

# Terminal 1
~$ nc -l -p9999

# Terminal 2
~$ python ./test_script.py

# Terminal 1
typingsomestring

# Terminal 2
No data available
No data available
No data available
got data 'typingsomestring
'
No data available
No data available

# Terminal 1
Ctrl+C # (killing nc)

# Terminal 2
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''
got data ''

最佳答案

这是在底层操作系统 recv 系统调用中设计的:在对等方关闭的套接字上读取,或者一旦对等方使用 shutdown(s, SHUT_WR) 表示不再发送任何内容,立即返回,长度为 0 字节。

这是唯一成功读取 0 字节的情况,因为当对等套接字保持打开状态时,成功的读取在阻塞套接字上至少返回一个字节,或者在非阻塞套接字上返回 E_AGAIN 或 E_WOULDBLOCK 错误。

TL/DR:观察到的行为没有异常

关于python - `sock.recv()` 当连接在非阻塞套接字上死亡时返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37330993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com