【问题标题】:python socket object accept time outpython socket对象接受超时
【发布时间】:2011-09-08 21:05:20
【问题描述】:

问题:python 中的 socket.accept() 函数是否存在某种超时或中断?


信息:

我有一个程序,它有一个绑定到端口的子线程,并且不断地接受和处理并将它们传递给主线程的队列。现在我正试图让子线程中断,以便它可以适当地解构。我认为我可以简单地停止子线程并让父线程解构子线程,但在其他时候我希望能够返回早期表单接受,所以我决定这将是最有用的方法。

那么,有没有一种方法可以让我超时或取消接受方法,以便线程可以在没有先连接的情况下返回?

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    您可以使用settimeout(),如本例所示:

    import socket
    
    tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    tcpServer.settimeout(0.2) # timeout for listening
    tcpServer.bind(('0.0.0.0', 10000)) # IP and PORT
    tcpServer.listen(1)
    
    stopped = False
    while not stopped:
      try: 
        (conn, (ip, port)) = tcpServer.accept() 
      except socket.timeout:
        pass
      except:
        raise
      else:
        # work with the connection, create a thread etc.
        ...
    

    循环将一直运行,直到 stopped 设置为 true,然后(最多)在您设置的超时后退出。 (在我的应用程序中,我将连接句柄传递给新创建的线程并继续循环,以便能够接受更多的同时连接。)

    【讨论】:

      【解决方案2】:

      您可以使用

      设置默认超时
      import socket
      print socket.getdefaulttimeout()
      socket.setdefaulttimeout(60)
      

      AFAIK 这将影响所有套接字操作

      【讨论】:

      • 会吗?行。当我阅读文档时,它听起来好像只影响了发送和接收。谢谢!
      【解决方案3】:

      也许settimeout() 就是您要找的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-27
        • 2012-10-16
        • 2013-07-01
        • 2017-11-24
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2015-08-17
        相关资源
        最近更新 更多