python - Python 监听套接字如何设置?

标签 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 套接字的意图,但尚未执行任何操作。

我很好奇的是:

  • 在不监听的情况下绑定(bind)到套接字是什么意思?
  • 如何使用 listen(n) 限制未接受的连接数?
    • 如果你有 listen(1),你正在处理你接受的第一个连接,第二个客户端尝试连接,第二个客户端正在等待 SYN-ACK 吗?或者是否发生了 3 次握手,他正在等待实际数据?
    • 如果第三个客户端尝试连接会发生什么 - 他会立即获得 TCP RST 吗?
    • 在这里设置未接受的连接数是否会在内核中设置一些选项来指示它应该接受多少连接?或者这一切都是用 Python 处理的?
  • 你怎么能在不接受的情况下倾听呢?接受连接是什么意思?

我看到的每篇文章似乎都只是假设这些步骤对每个人都有意义,而没有解释每个步骤到底做了什么。他们只是使用通用术语,例如

listen() starts listening for connections

bind() binds to a socket

accept() just accepts the connection

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

最佳答案

它基本上是 POSIX c 调用的一对一调用,因此我包含了手册页的链接,以便您可以阅读它们的解释和相应的 c 代码:

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

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

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

像往常一样你可以找到人explaining the previous对你好多了。

accept然后创建一个与新文件描述符相关联的新非监听套接字,然后您将使用该套接字与所述连接方进行通信。 accept 还充当您执行流程的指导者,有效地阻止进一步的进展,直到队列中实际可用的连接可供它使用,就像自旋锁一样。解决这个问题的唯一方法是声明套接字是非阻塞的,在这种情况下它会立即返回错误。

关于python - Python 监听套接字如何设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53583076/

相关文章:

c# - 正确使用 BeginReceive/EndReceive?

Java 套接字 : Request-response pattern with object streams

Python找不到文件

python - 使用生成器从成批的 .npy 文件训练 Keras 模型?

node.js - 跨多个 Amazon EC2 实例水平扩展 socket.io

python - Python中无法接收UDP数据包

Java套接字编程。如何在后台等待服务器响应?

python - 在傅立叶域中用内核卷积图像

python - 使用 Pandas 比较字符串到 JSON

python - 如何避免浮点运算问题?