无法在 Python 3 中接收 UDP 消息



我一直在尝试让UDP聊天服务器工作,以便它在特定端口上进行通信,并且可以在不知道其IP地址的情况下找到服务器。 最终目标是机器人上的一个Pi,另一个Pi作为控制器。 我卡住的地方是客户端发送广播消息,服务器响应。 客户端不会收到服务器的消息。 根据Wireshark的说法,客户端发送正确的广播。 服务器以确认作为响应。这 2 个数据包看起来不错。然后,客户端将 ICMP 消息发送回服务器,"目标无法访问(端口无法访问("。客户端显示它发送的消息,就好像它是它从服务器接收的消息,而不是服务器实际发送的消息。我试图检查队列中是否有第二条消息,但没有。 我正在使用 Ubuntu 18.04 和 Raspbian - Buster,防火墙在测试期间被禁用。下面是客户端和服务器的代码。 我已经用我尝试过的内容注释了代码。

我是Python的新手,这是我的第一篇文章。

来自 Wireshark

时间源目标协议长度

734 60.872408950 192.168.0.127 192.168.0.255 UDP 52 5001 → 5001 Len=10

737 60.918404508 192.168.0.90 192.168.0.127 UDP 55 5001 → 5001 Len=13

738 60.918427423 192.168.0.127 192.168.0.90 ICMP 83 目标无法访问(端口无法访问(

客户端输出

发送:"Hey_Server"到 ('255.255.255.255', 5001( 等待接收 收到的确认服务器 -- ip: ('192.168.0.127', 5001( 数据 = b'Hey_Server'

服务器输出

服务器侦听... 从 ('192.168.0.127', 5001( 接收 10 个字节 数据:"Hey_Server" 响应。。。 已将确认发送回('192.168.0.127',5001(,并带有消息Server23_Here">

客户

#!/usr/bin/python3
from socket import *
import sys
import time
# Create a UDP socket
sock = socket(AF_INET, SOCK_DGRAM)
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sock.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
sock.settimeout(5)
# server_address = ('192.168.0.255', 5001)
# server_address = ('255.255.255.255', 5001)
# tried to set the bind a second time - same results as above
# server_address = ('', 5001) &&  client_address = ('', 5001)
# Nothing goes out on the wire
# server_address = ('127.0.0.1', 5001)
# server_address = ('127.255.255.255', 5001)
# server_address = ('0.0.0.0', 5001)
server_address = ('255.255.255.255', 5001)
client_address = ('', 5001)
message = 'Hey_Server'
sock.bind((server_address))
try:
# Send data
print('sending: "' + message + '" to ' + str(server_address))
sent = sock.sendto(message.encode(), server_address)
# sock.bind((client_address))
# Receive response
print('waiting to receive')
udp_data = sock.recvfrom(1024)
print('Received confirmation Server -- ip: ' + str(udp_data[1]) + " data = " + str(udp_data[0]) + 'n')
finally:
sock.close()

服务器

#!/usr/bin/python3
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('', 5001)
port = 5001
sock.bind(server_address)
print("Server Listening...")
response = 'Server23_Here'
while True:
data, address = sock.recvfrom(4096)
data = str(data.decode('UTF-8'))
print('Received ' + str(len(data)) + ' bytes from ' + str(address) + ' Data: "' + data + """)
if data == 'Hey_Server':
print('responding...')
client_address = (address[0], port)
sent = sock.sendto(response.encode('UTF-8'), client_address)
print('Sent confirmation back to ' + str(client_address) + " with message "" + response + """)

您需要发送到 recvfrom "data, address = sock.recvfrom(4096(" 返回的地址中包含的端口,因为客户端的端口将与您在服务器中侦听的端口不同。

最新更新