微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

s.bind((hostIPAddress,22)) OSError: 99

如何解决s.bind((hostIPAddress,22)) OSError: 99

我正在尝试使用我自己家庭网络上的本地 IP 地址(而不是我网络外的设备),让我的机器人通过套接字与我的 PC 通信。机器人充当服务器,而我自己的 PC 充当客户端/主机。我真的不知道我的机器人上打开了哪些端口,但我确实知道机器人上的端口 22 是打开的(即 SSH 端口)。该机器人是一个乐高 EV3 机器人,除了它已经安装了一些 ev3python 软件。当我运行我的程序时,我在服务器(我的机器人)上收到以下错误

File "/home/robot/server/server.py",line 24,in <module>
  File "socket/socket.py",line 50,in bind
OSError: 99

这是我的注释代码

#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor
from pybricks.parameters import Port

# Create your objects here

# Initialize the EV3 Brick.
ev3 = EV3Brick()

# Initialize a motor at port B.
#test_motor = Motor(Port.B)

import socket

hostIPAddress = "xx.xx.xx.xx" #the local IP address of my PC on my home network 
backlog = 1
size = 1024
s = socket.socket(socket.AF_INET,socket.soCK_STREAM)
s.bind((hostIPAddress,22))#22 is the port number I am using. (THIS IS ALSO THE LINE WHERE THE ERROR IS COMING FROM) 
s.listen(backlog)
try:
    client,address = s.accept()
    while 1:
        data = client.recv(size)
        if data:
            draw_text(89,64,data,text_color=Color.RED,background_color=None)
            clear()

        if data == "beep":
            ev3.speaker.beep(frequency=1000,duration=500)
        
        #if data == "move":
            #test_motor.run_target(500,90)

except: 
    print("Closing socket") 
    client.close()
    s.close()

这是客户端/主机的代码(我不认为这会有所帮助,但可能会有所帮助):

import socket

serverIPAddress = "xx.xx.xx.xx" #the local IP address of my robot on my home network 
s = socket.socket(socket.AF_INET,socket.soCK_STREAM)
s.connect((serverIPAddress,22))
while 1:
    text = input()
    if text == "quit":
        break
    s.send(bytes(text,'UTF-8'))
s.close()

解决方法

hostIPAddress = "xx.xx.xx.xx" #the local IP address of my PC on my home network 
backlog = 1
size = 1024
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((hostIPAddress,22))#22 is the port number I am using. (THIS IS ALSO THE LINE WHERE THE ERROR IS COMING FROM) 
s.listen(backlog)

这里至少有两个问题:

您正在尝试将套接字绑定到远程系统的 IP 地址。这不是 bind 所做的; bind 设置套接字的本地地址(通常仅用于像您这样的监听套接字)。由于您可能不关心机器人侦听的 IP 地址,您可以使用 0.0.0.0 表示“任何 IP”。

接下来,您尝试侦听已知已被其他服务使用的端口(端口 22 上的 ssh)。您应该为您的服务决定另一个端口。我建议使用 1024 以上的端口,因为低于 1024 的端口通常是“特权”的并且需要 root 来监听。只要不涉及防火墙,任何端口都可以。

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("0.0.0.0",5555))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。