You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中sendto函数触发OSError: [Errno 22]无效参数问题求助

解决sendto()抛出OSError: [Errno 22] Invalid Argument的问题

刚看到你碰到的这个棘手问题——执行命令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

火山引擎 最新活动