`sock.recv()`在非阻塞s上连接断开时返回空字符串

2024-06-17 13:11:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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 ''

Tags: noimportdataossysmsgsleepsocket