网络驱动器运行exe遇Socket WinError 10022错误,求排查方案
问题原因及解决方案
核心代码逻辑错误
你的check_port函数完全搞反了Socket的使用场景:
bind()、listen()、accept()是服务器端用来监听本地端口、接受客户端连接的操作,而你要做的是客户端检测远程主机的端口可用性,这些操作完全多余且错误。- 在客户端Socket上执行
bind('',22)会尝试绑定本地22端口,若本地22端口已被占用(比如本机开启了SSH服务),或在网络驱动器的exe运行环境中Socket参数校验更严格,就会抛出WinError 10022无效参数错误。
本地运行未报错的原因
本地.py或打包的exe运行时,可能刚好本地22端口未被占用,或是系统对Socket参数的校验宽松,暂时没触发错误,但代码逻辑本身是错误的——哪怕本地没报错,也无法正确检测远程端口(因为你在做服务器监听,根本没去连接远程主机)。
修正后的代码
把check_port函数改成正确的客户端端口检测逻辑:
import socket import logging import traceback from xml.dom import minidom file = minidom.parse('Sessions.XML') sessiondata_all = file.getElementsByTagName('SessionData') failed_ips = [] def check_port(host, port): target_port = int(port) # 创建客户端Socket,无需bind、listen操作 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: # 设置超时,避免单个不可达主机拖慢整体检测 sock.settimeout(3) # connect_ex返回0表示连接成功,非0表示连接失败 if sock.connect_ex((host, target_port)) != 0: failed_ips.append(host) def main(): try: for sessiondata in sessiondata_all: host = sessiondata.attributes['Host'].value port = sessiondata.attributes['Port'].value print(f"{host}:{port}") check_port(host, port) except Exception as e: logging.error(traceback.format_exc()) print(failed_ips) if __name__ == '__main__': main()
额外说明
网络驱动器上的exe运行报错,本质是错误的Socket操作在更严格的环境下触发了参数校验失败,修正逻辑后即可解决。
内容的提问来源于stack exchange,提问作者emanuel
相关产品推荐
相关产品推荐

