我正在尝试使用Python中的套接字通过以太网连接使用UDP协议发送和接收二进制数据。
我设法使用独立脚本来完成此操作,并通过使用以太网电缆连接两台笔记本电脑并使用另一台笔记本电脑上的 Hercules 软件发送/接收数据来测试它。
但是,当尝试在基于 PyQt6 的 GUI 应用程序中执行此操作时,我收到以下错误:
line 33, in __init__
self.sock.connect((self.sendToAddress, self.sendToPort))
socket.gaierror: [Errno 11001] getaddrinfo failed
我的主要职能是:
def __init__(self, addr, port):
self.sock = socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM) # UDP
self.data = None
self.sendToAddress = str(addr)
self.sendToPort = int(port)
self.reply_data = None
self.replyBufSize = 1024
self.sock.bind(('169.234.29.200', 8000))
self.sock.connect((self.sendToAddress, self.sendToPort)) # error caused by this line
def sendData(self):
if(isinstance(self.data, bytes) == False):
self.data = self.data.encode()
bytes_Sent = self.sock.sendto(self.data, (self.sendToAddress, self.sendToPort))
print("sent data = ", self.data)
print("bytesSent = ", bytes_Sent)
def getData(self):
while self.reply_data is None:
print("waiting for msg")
self.reply_data = self.sock.recvfrom(self.replyBufSize)
print("still waiting")
print(self.reply_data)`
独立脚本和 PyQt6 应用程序中的发送和接收代码是相同的,但它可以在独立脚本中工作,但在这里失败。
我在网上广泛查找了这个问题,几乎所有解决方案都涉及缺失的
socket.connect()
语句。然而,就我而言,似乎是 socket.connect()
造成的。
我还尝试刷新我的 DNS,并重新启动电脑。
更新:
我将
sendToAddress
和 sendToPort
作为用户的输入,将它们存储在充当共享内存的文件中,并在需要创建套接字时读取它们。是否有任何特定原因导致将值作为输入导致错误?
我使用
print(socketObj.getsockname())
来验证套接字对象是否已正确创建。调用 connect()
时仍然出现错误。
我解决了!简而言之,通过转到
Control Panel\Network and Internet\Network Connections
并更改 Ethernet Adapter
设置,我输入了应用程序正在使用的正确 IP 地址。
希望这可以帮助遇到同样问题的人!