【问题标题】:Establishing UDP communication with python与python建立UDP通信
【发布时间】:2018-05-07 15:14:42
【问题描述】:

所以,我这里有这段代码。这个发件人脚本给我正确的输出。

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 0
MESSAGE = "Hi, can you listen to this?"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

我尝试在另一台主机上使用此脚本并尝试在两者之间建立通信。 (两个系统都在同一个网络上,例如 00.000.00.xxx ,只有 xxx 部分不同)

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 0

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))

while True:
    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
    print "received message:", data

这是输出

Traceback (most recent call last):
  File "C:/Users/bshivaku/Desktop/SEnd_Udp_packets.py", line 9, in <module>
    sock.bind((UDP_IP, UDP_PORT))
  File "C:\Python27\Lib\socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 10049] The requested address is not valid in its context

我在 sender script 上使用了 receiver 的 ip 地址,在 receiver 上使用了 sender ip 地址 我确定我在 UDP_PORT 上犯了一个错误,所以我使用了 PORT= 0 并尝试了。如何请求端口号?如何建立连接?如果不是端口,我哪里出错了?

【问题讨论】:

    标签: python networking udp communication packet


    【解决方案1】:

    发送消息时使用特定端口,例如UDP_PORT=8765,否则如果UDP_PORT设置为0,那么系统会为你随机选择一个端口。

    在发送者脚本中使用接收者主机的ip地址并绑定到接收者脚本中的任意接口。

    在接收端使用发送端脚本中配置的相同 UDP 端口号。

    接收者:

    import socket
    UDP_IP = "0.0.0.0"
    UDP_PORT = 8543
    
    sock = socket.socket(socket.AF_INET, # Internet
                         socket.SOCK_DGRAM) # UDP
    sock.bind((UDP_IP, UDP_PORT))
    
    while True:
        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        print "received message:", data
    

    发件人:

    import socket
    
    UDP_IP = "<ip_address_of_receiver>"
    UDP_PORT = 8543
    MESSAGE = "Hi, can you listen to this?"
    
    print "UDP target IP:", UDP_IP
    print "UDP target port:", UDP_PORT
    print "message:", MESSAGE
    
    sock = socket.socket(socket.AF_INET, # Internet
                         socket.SOCK_DGRAM) # UDP
    sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
    

    除了 UDP 地址设置之外,python 端没有任何问题。

    关于错误:

    [Errno 10049] The requested address is not valid in its context
    

    这通常源于尝试绑定到对本地计算机无效的地址:因此似乎您的计算机上未配置环回地址 127.0.0.1。

    在系统管理员端进行调查,例如检查您的机器上是否启用了 IPv4 网络堆栈。

    【讨论】:

    • 啊.. 工作就像一个魅力..我还尝试在双方都使用特定的端口号,并添加实际的 IP 地址而不是 0.0.0.0。没有工作。那么这个 0.0.0.0 是干什么用的呢?诸如监听所有地址的开放端口之类的东西?
    • 对于约定 0.0.0.0 表示本地机器上的所有 IP 地址,因此您的套接字侦听所有网络接口上的传入消息。
    • 好的,谢谢。 :)
    • 欢迎!不要忘记接受它对你有用的答案。
    • 所以,现在我还有一个问题。我读到,为了将数据作为 udp 的有效负载发送,我需要考虑以太网、ipv4 或 v6 的标头,然后是 udp。那么在上面的例子中,是否考虑了以太网和ipv?因为分配了源和端口,但我完全不明白是否考虑了以太网或互联网和 ipv4 或 v6 的标头,因为 udp 标头也有一个 2 字节的源和目标端口)。任何人都可以分享此类程序的任何示例以更好地理解吗?或请解释..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多