在 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的示例