Python中sendto函数触发OSError: [Errno 22]无效参数问题求助
刚看到你碰到的这个棘手问题——执行命令python3 ringo.py F 6003 networklab1.cc.gatech.edu 6002 2时,明明打印出来的poc_address是合法元组('130.207.107.12', 6002),但调用sendto()还是触发了OSError: [Errno 22] Invalid argument。先把你的相关代码贴出来方便分析:
poc_address = (poc_name, int(poc_port)) peer_data = json.dumps({ 'command': 'peer_discovery', 'peers': peers, 'ttl': 6, }) print(poc_address) # ('130.207.107.12', 6002) server.socket.sendto( peer_data.encode('utf-8'), poc_address <--- 错误发生处!! )
这个错误最常见的几个原因和对应的解决方法给你列出来:
Socket类型不匹配:如果你的
server.socket是TCP类型(创建时用了socket.SOCK_STREAM),那sendto()是UDP专属方法,TCP应该先调用connect(poc_address)建立连接,再用send()发送数据。比如改成:server.socket.connect(poc_address) server.socket.send(peer_data.encode('utf-8'))地址格式与Socket不兼容:虽然你打印的是IPv4地址,但有可能主机名
networklab1.cc.gatech.edu解析出了IPv6地址,而你的Socket是IPv4(AF_INET)类型的,传递混合类型地址就会报错。可以用socket.getaddrinfo()确保地址和Socket类型匹配:# 根据Socket类型自动解析正确的地址 addrinfo = socket.getaddrinfo(poc_name, int(poc_port), server.socket.family, server.socket.type) poc_address = addrinfo[0][4]Socket状态异常:检查你的Socket是否已经正确初始化、绑定,有没有在关闭或者未就绪的状态下调用
sendto()。比如Socket已关闭或未完成绑定操作,也可能抛出这个错误。
另外可以快速验证下JSON序列化是否正常——虽然这个错误大概率和数据无关,但可以加一行json.loads(peer_data)确认序列化后的字符串是合法JSON,排除数据格式的干扰。
内容的提问来源于stack exchange,提问作者merry-go-round




