在 Python 中使用 socket.connect() 之前找到 OS 生成的端口

Find OS generated port before using socket.connect() in Python

我想问一下是否有任何方法可以在 Python 中创建一个套接字,使用:

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

然后,提取OS生成的端口,使用前:

sock.connect((SERVER_IP, SERVER_PORT)

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

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

generated_port = sock.getsockname()[1]

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

任何帮助将不胜感激!

本地端口只有在套接字绑定到本地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))