将超时添加到python服务器时出现非阻塞错误

Ric*_*ard 5 python sockets tcpserver

我正在用python写一个简单的TCP服务器,并试图输入一个超时。我当前的代码:

import socket


def connect():
    HOST = ''                 # Symbolic name meaning the local host
    PORT = 5007             # Arbitrary non-privileged port
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    s.settimeout(5)
    conn, addr = s.accept()
    print 'Connected by', addr
    return conn

conn = connect()

while 1:
    data = conn.recv(1024)
    if not data: break
    print data
conn.close()
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试连接时,在data = conn.recv(1024)时出现错误

error: [Errno 10035] A non-blocking socket operation could not be completed immediately
Run Code Online (Sandbox Code Playgroud)

代码可以正常工作而不会超时。

Use*_*ser 2

您可以开启阻止:

    # ...
    conn.setblocking(1)
    return conn
# ...
Run Code Online (Sandbox Code Playgroud)

  • 实际上设置超时使其非阻塞。来自文档 ->“s.settimeout(0.0) 相当于 s.setblocking(0);s.settimeout(None) 相当于 s.setblocking(1)。” 请参阅https://docs.python.org/2/library/socket.html#socket.socket.settimeout (5认同)
  • 这根本不能解释为什么设置超时会导致它变成非阻塞。据我所知,它肯定不在 python 文档中,而且我很好奇为什么会发生这种情况。 (2认同)