Python套接字不会超时

时间:2017-07-11 16:27:24

标签: python sockets tcp

我遇到了Python套接字模块的问题,我无法在其他任何地方找到它。

我正在构建一个简单的TCP聊天客户端,并且当它最初成功连接到服务器时,尽管我明确设置了超时长度,但脚本在sock.recv()上无休止地挂起。

我尝试过使用不同的超时值并包含setblocking(False),但无论我做什么,它都会像套接字一样处于阻塞模式。

以下是我的代码的相关部分:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)

def listen_to_server():
    global connected

    while connected:
        ready_to_read, ready_to_write, in_error = select.select([sock], [], [])

        if ready_to_read:
            try:
                data = sock.recv(1024)
            except socket.timeout:
                print('TIMEOUT')
            if not data:
                append_to_log('Disconnected from server.\n')
                connected = False
            else:
                append_to_log(str(data))

任何建议都会有所帮助,我在这里完全失去了。

1 个答案:

答案 0 :(得分:2)

您混合了socket timeoutselect两件事。

当你设置socket timeout然后你告诉那个套接字:如果我尝试做一些操作(例如recv())并且它不会被完成直到我的限制然后提高超时异常。

select接受文件描述符(仅在Windows上的套接字)并开始检查rlist(第一个参数)是否包含任何准备好读取的套接字(也就是某些数据已到达)。如果有任何数据到达,则程序继续。

现在你的代码执行此操作:

  1. 设置套接字操作的超时
  2. 选择开始等待数据(如果您不发送它们,那么它们永远不会到达)
  3. 就是这样。你坚持选择。

    您应该在没有选择的情况下致电recv()。应该应用你的超时。

    如果您需要一次管理多个套接字,则必须使用select并设置第4个参数超时。