如何使用 python 套接字在特定端口发送消息?没有随机端口

How to send a message in a specific port with python sockets ? No random ports

我必须在本地主机上测试带有确认的广播。所以我有一些代表节点的文本文件,里面有一个邻居列表。
我使用localhost作为IP,端口是节点号。

问题是当我从 7000 这样的节点收到(我发送的)消息时,python 将其替换为随机数,例如 65724。所以现在我父亲是 65724 而不是 7000,所以我无法从邻居列表中删除 7000。
我无法完成我的算法,这非常令人沮丧。

我可以用我想要的端口号发送消息,但不是很优雅。

有人能告诉我如何不允许 python 随机化端口吗?

rmunn 救了我,我一直在寻找的答案是 bind before connect 方法。在发送消息之前,您绑定自己的端口并连接到另一个端口。

这本身不是 Python 问题。您对端口的工作方式感到困惑。

每个 TCP 通信(发送或接收)都有两个 IP 地址和两个端口:主机 IP 和主机端口,以及目标 IP 和目标端口。

如果您正在与网络上的计算机 "out there" 通信,您的主机 IP 和目标 IP 将不同。在您的测试用例中,您的主机 IP 和目标 IP 均为 127.0.0.1(本地主机)。但我将使用 "different IPs" 案例作为我的示例,因为它更易于查看。

所以您的 IP 地址是 10.1.2.3,您正在与 10.1.2.99 的计算机通话。你告诉系统你想在端口 7000 与 10.1.2.99 对话,它会打开一个连接。发生这种情况时,它将随机 选择一个未使用的源端口。所以现在有一个 two-way 沟通渠道开放:

10.1.2.3:65274 <-> 10.1.2.99:7000

请注意,您没有选择该主机端口。 编辑: 我最初在这里说 "In fact, the system will not allow you to pick the host port; it will be assigned to you",但那是错误的。如果s是套接字object,你可以调用s.bind()设置它的源端口,然后调用s.connect()连接到目标端口。

现在,当您收听 消息时,您可以选择正在收听的端口,连接到您的计算机将有一个随机端口。因此,如果您正在侦听端口 8912 上的消息,传入连接(一旦建立)将如下所示:

10.1.2.3:8912 <-> 10.1.2.99:38290

请注意,38290 是由 IP 地址为 10.1.2.99 的计算机的操作系统随机选择的。

现在开始 Python。您在问题标题中提到了套接字,所以我假设您使用的是 Python 标准库中的 socket 模块。一旦你创建了一个套接字 object s,使用 s.getpeername() 找出你连接的地址(主机和端口),并使用 s.getsockname() 找出您从.

连接的地址(主机和端口)

既然你谈到期望数字 7000 并获得一个随机数,我认为你在使用 host 套接字,而你应该使用 destination 套接字。