【问题标题】:Arbitrarily large number of sockets - Python [duplicate]任意数量的套接字 - Python [重复]
【发布时间】:2015-05-22 19:51:48
【问题描述】:

我最近开始搜索socket编程,并决定使用python进行测试。我有以下问题:正如我所读到的,您只能在服务器端套接字中侦听有限数量的连接,因此您一次只能有这么多个连接操作。有没有办法能够保持系统可以容忍的尽可能多的套接字打开?那是例如在聊天服务器的情况下(例如,您不希望一次只有 5 个活跃用户)。

解决办法是什么?是否应该创建更多套接字来实现这一目标?但是,系统可用的端口数量是否会成为下一个限制?

【问题讨论】:

  • 你的意思是你给'listen'函数的小参数吗?
  • 是的,并且文档指定存在一个与系统相关的最大值 - 可能相当小。
  • 我要删除它吗?尽管我认为在这个问题上我对listen 的实际作用的误解很明显,而在另一个问题上,提出问题的人确实了解其作用,但希望克服限制。既然我得到了我想要澄清的东西,如果你真的认为这个问题是不必要的,我会删除它。
  • 我认为你应该删除这个问题。在我看来,两位作者似乎都关心listen 的参数,而实际上重复调用accept 的发生速度应该快于监听队列的增长速度。同时连接的数量是监听参数的不同参数。

标签: python sockets server-side


【解决方案1】:

如果你问的是函数'listen':

'backlog' 参数是套接字的挂起连接队列可能增长到的最大长度。

如果队列已满时连接请求到达,客户端可能会收到带有 ECONNREFUSED 指示的错误,或者,如果底层协议支持重新传输,则可能会忽略该请求,以便稍后重新尝试连接成功。

这不会对套接字连接数设置任何限制。只有那些还没有被“接受”的(例如,还没有成为“连接”)。

当客户端尝试连接时,积压会增加 1。

当您调用“接受”时,积压会减少 1。

因此,如果您定期调用“接受”,您将打开许多连接。

【讨论】:

  • 那么如果另一个套接字在队列已满时尝试连接,它的连接会被取消吗?
  • 它可能会也可能不会,取决于实现。查看更新。
  • 通常不需要担心积压。只要确保您在准备就绪后立即接受()连接。例如。如果您进行基于事件(单线程)的编程,您将使用所有已建立连接的文件描述符以及服务器套接字进行阻塞 select() 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
相关资源
最近更新 更多