【问题标题】:listen() method parameters in pythonpython中的listen()方法参数
【发布时间】:2018-06-22 23:34:10
【问题描述】:

我是 Python 新手,最近对套接字编程很感兴趣。从 youtube 视频中,我正在构建一个简单的服务器,但我没有很好地获得 listen() 方法。我知道“它侦听”传入连接,但我没有在文档中得到“最大排队连接”的想法。能否通俗地解释一下这个概念,以便我更好地理解?

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    socket.listen 在 Python 中调用底层的listen syscall

    listen() 将 sockfd 引用的套接字标记为被动套接字,即将使用 accept(2) 接受传入连接请求的套接字。

    被动套接字是您非正式地称为服务器的套接字。

    backlog 参数定义了 sockfd 的挂起连接队列可以增长到的最大长度。如果队列已满时连接请求到达,客户端可能会收到带有 ECONNREFUSED 指示的错误,或者,如果底层协议支持重传,则可能会忽略该请求,以便稍后重新尝试连接成功。

    换句话说,当您调用sock.listen(5) 并且在您调用accept 之前有6 个连接请求进入时,其中一个会被丢弃。在实践中,the value is only a hint to the OS

    除非您的应用程序或其使用场景非同寻常,否则请传入任何值(通常引用 5)并完成。只需确保在 accept 调用之间没有太多开销,待处理连接的队列永远不会满,而且一开始就很少使用。

    【讨论】:

    • 感谢您的回复。我们可以把这比作许多人试图访问一个网站而其中一些人无法访问的过程吗?例如,当我校园里的所有人都尝试访问该网站以注册他们的课程时,这种情况总是会发生:)
    • 是的,过载是接收队列发挥作用时的典型情况。但是,在这种情况下,大量积压是没有帮助的:如果服务器承受的负载过多而无法处理,则扩展接收队列只会意味着管理等待连接的更多负载。在过载情况下,您确实希望尽快终止新的传入连接,以便至少有一些查询有机会完成。
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多