Python侦听套接字如何设置?

时间:2018-12-02 18:01:50

标签: python sockets

使用Python的“套接字”模块设置简单的TCP侦听套接字时,涉及的不同步骤是什么?

我正在谈论的代码如下:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 50000))
s.listen(1)
conn, addr = s.accept()

s = ...似乎很简单-您表达的意图是创建ipv4 TCP套接字,而尚未做任何事情。

我很好奇的是:

  • 不听而绑定套接字是什么意思?
  • 如何使用listen(n)限制不可接受的连接数?
    • 如果您有listen(1),则说明您正在处理接受的第一个连接,而第二个客户端尝试连接,第二个客户端是否在等待SYN-ACK?还是发生3种握手方式,而他正在等待实际数据?
    • 如果第三个客户端尝试连接会发生什么-他会立即获得TCP RST吗?
    • 是否在此处设置了不可接受的连接数,是否在内核中设置了一些选项以指示它应接受多少个连接?还是全部用Python处理?
  • 您如何不接受就可以收听?接受连接是什么意思?

我所读过的每篇文章似乎都只是假设这些步骤对每个人都有意义,而没有解释每个人的确切含义。他们只是使用

之类的通用术语
  

listen()开始监听连接

     

bind()绑定到套接字

     

accept()仅接受连接

在定义中使用该单词来定义单词是一种愚蠢的解释方式。

1 个答案:

答案 0 :(得分:1)

它基本上是POSIX c调用中的一对一,因此我包括指向手册页的链接,以便您可以阅读其说明和相应的c代码:

socket通过文件描述符在您指定的地址族的命名空间中创建一个通信端点,但既不分配地址也不分配端口。

bind为该套接字分配一个地址和端口,如果您请求一个没有特权的端口,则可以随机选择一个端口。 (例如<1024对于非root用户)

listen使特定的套接字以及地址和端口成为被动端口,这意味着它将通过accept调用接受传入的连接。要一个接一个地处理多个连接,您需要指定一个包含它们的待办事项,处理一个连接时到达的连接将被追加。一旦积压已满,系统将通过保留SYN,保留ACK响应等使系统重新连接的方法。

和往常一样,您可以找到一个更好的人explaining the previous

accept然后创建与新文件描述符关联的新的非监听套接字,然后将其用于与所述连接方进行通信。 accept还可以充当执行流程的主管,有效阻止进一步的进展,直到在队列中实际可用的连接(例如自旋锁)为止。解决此问题的唯一方法是声明套接字未阻塞,在这种情况下它将立即返回错误。