UDP 服务器只从绑定到特定端口的客户端接收数据

时间:2021-07-27 18:16:57

标签: python sockets raspberry-pi udp raspberry-pi3

我正在尝试通过以太网在两个 Raspberry Pi 之间建立 UDP 通信,但似乎我的服务器仅在客户端连接到特定端口时才接收客户端数据包。

我们称它们为 Rasp A 和 Rasp B。它们安装了不同的软件和不同的配置。

Rasp A 可以正常作为服务器和客户端工作,但 Rasp B 出现了一些问题。

当我设置B为服务器,A为客户端时,只有客户端绑定了8002或8003端口,B才会收到A的数据包。我把脚本放在下面。

服务器代码:

    import socket
    
    # localIP     = "169.254.155.4"
    localIP     = "128.30.1.198"
    
    localPort   = 8002
    bufferSize  = 1024
    
    msgFromServer = "Hello UDP Client"
    bytesToSend  = str.encode(msgFromServer)
    
    
    # Create a datagram socket
    UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
    
    # Bind to address and ip
    UDPServerSocket.bind((localIP, localPort))
    
    print("UDP server up and listening")
    
    # Listen for incoming datagrams
    try:
      while(True):
        bytesAddressPair = UDPServerSocket.recvfrom(bufferSize)
        message = bytesAddressPair[0]
        address = bytesAddressPair[1]
    
        clientMsg = "Message from Client:{}".format(message)
        clientIP  = "Client IP Address:{}".format(address)
    
        print(clientMsg)
        print(clientIP)
    
        # Sending a reply to client
        UDPServerSocket.sendto(bytesToSend, address)
        # UDPServerSocket.close()
    
    except Exception as ex:
            print (ex)
            UDPServerSocket.close()

客户端代码:

import socket

 

msgFromClient       = "Hello UDP Server"

bytesToSend         = str.encode(msgFromClient)

serverAddressPort   = ("128.30.1.198", 8002)

bufferSize          = 1024

 

# Create a UDP socket at client side
print('creating socket')
UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPClientSocket.bind(('128.30.1.2',8002))


# Send to server using created UDP socket
print('sending message')
UDPClientSocket.sendto(bytesToSend, serverAddressPort)

 
print('receiving message')
msgFromServer = UDPClientSocket.recvfrom(bufferSize)

 

msg = "Message from Server {}".format(msgFromServer[0])

print(msg)

Rasp B 只会在客户端绑定到端口 8002 或 8003 时按预期接收数据包,如果套接字绑定到任何其他端口或根本没有绑定,则不会接收任何内容。以下是一些嗅探到的数据包:

工作通讯

客户端发送>>>

###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 44
     id        = 5063
     flags     = DF
     frag      = 0
     ttl       = 64
     proto     = udp
     chksum    = 0x23f6
     src       = 128.30.1.2
     dst       = 128.30.1.198
     \options   \
###[ UDP ]### 
        sport     = 8003
        dport     = 8002
        len       = 24
        chksum    = 0xc98f
###[ Raw ]### 
           load      = 'Hello UDP Server'
###[ Padding ]### 
              load      = '\x00\x00'

服务器收到此消息并响应<<<

###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 44
     id        = 35228
     flags     = DF
     frag      = 0
     ttl       = 64
     proto     = udp
     chksum    = 0xae20
     src       = 128.30.1.198
     dst       = 128.30.1.2
     \options   \
###[ UDP ]### 
        sport     = 8002
        dport     = 8003
        len       = 24
        chksum    = 0x32e
###[ Raw ]### 
           load      = 'Hello UDP Client'

无法正常通讯: 客户端发送 >>>

###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 44
     id        = 6060
     flags     = DF
     frag      = 0
     ttl       = 64
     proto     = udp
     chksum    = 0x2011
     src       = 128.30.1.2
     dst       = 128.30.1.198
     \options   \
###[ UDP ]### 
        sport     = 8002
        dport     = 8004
        len       = 24
        chksum    = 0xc98e
###[ Raw ]### 
           load      = 'Hello UDP Server'
###[ Padding ]### 
              load      = '\x00\x00'

服务器未收到此消息且未响应。

是否与防火墙配置有关?

0 个答案:

没有答案