【问题标题】:Having an infinite amount of sockets connected?连接了无限数量的套接字?
【发布时间】:2012-11-20 22:58:00
【问题描述】:

我正在尝试制作聊天服务器。基本上,我希望多个客户端能够同时连接。

我想要它,所以它一直在听。每当有人尝试连接时,它都会立即接受并将其添加到连接列表中。

我可以先监听(1)然后超时,并继续将它们附加到列表中,然后关闭套接字,并创建一个新套接字,然后超时监听,等等。虽然,这看起来很慢,而且我'甚至不确定它会起作用

请记住,它不一定是套接字。如果有任何其他类型的网络接口,它也可以正常工作。

【问题讨论】:

  • 我在这里没有看到问题。您能否改述一下您的问题/问题?
  • 无限是一个很大的数字...
  • 据我所知没有操作系统支持无限数量的套接字..
  • 无穷大不是实数。它甚至不是一个虚数。
  • 我认为 OP 的意思是 infinite,意思是套接字的数量应该没有实际限制。

标签: python sockets networking


【解决方案1】:

根据您系统的内存,最大套接字数会有实际限制。

http://docs.python.org/2/library/socketserver.html。我认为最后几个示例(在 Asynchronous Mixins 下)非常接近您想要实现的目标。

【讨论】:

    【解决方案2】:

    考虑您是否真的需要为每个连接维护单独的套接字。像无连接UDP这样的东西合适吗?这样一来,您就可以支持任意数量的用户,同时只使用一个 OS 套接字。

    当然,使用这种方法,您需要在内部维护连接语义(如果您的应用程序关心这些事情);通过查看他们的 IP/端口或通过检查网络协议中的一些信封数据来确定每个数据报已发送到哪个用户,偶尔发送 ping 以查看另一端是否还活着,等等。但是这种方法应该很好地将你分开来自任何操作系统问题 RE:允许您的进程一次保持打开的套接字数量。

    【讨论】:

      【解决方案3】:

      您对问题的看法略有错误。使用服务器端套接字,您接受到同一个套接字的连接,然后由其他进程/线程处理。

      #
      # Setup socket and other handling stuff here
      #
      
      while True:
          conn = sock.accept()
          thread.start_new_thread(handler, (conn,))
      

      【讨论】:

      • sock.accept() 返回一个代表新建立连接的套接字。我认为这些是 OP 在“连接的无限数量的套接字”中所指的内容。
      • 我尝试过,但它让我头疼。您可能是对的 RE:OP 对哪个过程感到困惑。 ://
      【解决方案4】:

      我想要它,所以它一直在听。每当有人尝试连接时,它都会立即接受它们并将它们添加到连接列表中。

      所以你有:

      1. 一个 accept() 循环,除了 accept() 新连接之外什么都不做,并启动一个新线程来处理每个连接。

      2. 每个连接的一个线程读取一个长超时,无论您希望会话空闲超时是什么。如果超时到期,则关闭套接字并退出线程。

      如果服务器耗尽 FD,如果有足够的同时连接,accept() 将开始失败并显示相应的 errno:在这种情况下,您只需忽略它并继续循环。也许您在这种情况下减少空闲超时,并在接受再次开始工作时将其放回。

      【讨论】:

        猜你喜欢
        • 2017-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-01
        • 1970-01-01
        • 2018-08-10
        • 2021-05-18
        • 2018-03-12
        相关资源
        最近更新 更多