在 Python 中使用 socket.connect() 之前查找操作系统生成的端口

Posted

技术标签:

【中文标题】在 Python 中使用 socket.connect() 之前查找操作系统生成的端口【英文标题】:Find OS generated port before using socket.connect() in Python 【发布时间】:2022-01-21 23:22:06 【问题描述】:

我想问一下有没有办法在 Python 中创建一个套接字,使用:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

然后,在使用前提取操作系统要生成的端口:

sock.connect((SERVER_IP, SERVER_PORT)

即我的目标是在实际执行 3 次握手之前找到将发送到服务器的第一个 SYN 数据包的源端口,作为 3 次握手的一部分。

注意:我发现可以使用以下方法找出生成的端口:

generated_port = sock.getsockname()[1]

但是,不幸的是,generated_port 的值是在使用 sock.connect() 之后设置的。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

本地端口只有在套接字绑定到本地 IP 和端口后才可用。如果没有通过调用bind 显式完成,这将通过connect 隐式完成。因此,要在调用connect 之前获取本地端口,必须在此之前显式调用bind

import socket
s = socket.socket()
s.bind(('0.0.0.0',0))
print(s.getsockname()[1])  
s.connect((host,port))

【讨论】:

谢谢 :) 你的解决方案正是我正在寻找的

以上是关于在 Python 中使用 socket.connect() 之前查找操作系统生成的端口的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用 soffice,Command 在终端中有效,但在 Python 子进程中无效

python 使用pymongo在python中使用MongoDB的示例

在 python 中使用命令行时出现语法错误

python 在python中使用全局变量

如何在 Python 3.x 和 Python 2.x 中使用 pip

在Python中使用Redis