响应端口请求的设备的UDP通信来自,如何获得响应

时间:2014-02-11 17:36:34

标签: python sockets python-3.x udp

我目前正在尝试通过UDP接收设备信息。

我将使用<broadcast,因为我不知道该单位的IP。

之前从未进行任何UDP通信,我创建了一个基本的listener.py

import socket

if __name == "__main__":
    UDP_IP = ""
    UDP_PORT = 6137

    inbound = socket(AF_INET, SOCK_DGRAM)
    inbound.bind((UDP_IP, UDP_PORT))

    while True:
        data, wherefrom = inbound.recvfrom(1024, 0)
        data = struct.unpack("!L3i", data)
        data = str(data)
        sys.stderr.write(repr(wherefrom) + "\n")
        sys.stderr.flush()
        sys.stdout.write(data + "\n")
        sys.stdout.flush()

broadcast.py

from socket import *
import struct

def broadcast():

    if __name__ == "__main__":
        UDP_IP = '<broadcast>'
        UDP_PORT = 6137
        HEX = 0x2F03F4B2
        I = 0
        V = 0
        C = 0
        PAYLOAD = struct.pack("!L3i", HEX, I, V, C)
        comsocket = socket(AF_INET, SOCK_DGRAM) 
        comsocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
        comsocket.sendto(PAYLOAD, (UDP_IP, UDP_PORT))
        comsocket.close()

如果我运行listener.py然后运行broadcast.py,我会看到邮件已发送,并且已在另一端正确解压缩。

我遇到的问题是,当我发送此广播时(上面是我实际发送的内容的修改版本),设备意味着将响应发送回同一port所在地广播来自。

所以这就是我被困住的地方,我知道我可以socket.bind()强制我的广播从固定端口发送,因此设备将响应同一个端口但是如果我{{{ 1}}它显然不能在同一个端口上运行我的bind

如何使用“绑定广播”接收发送到我选择的端口的响应?

1 个答案:

答案 0 :(得分:2)

套接字可以发送和接收。如果它是udp并绑定到端口。您可以将消息发送回广播套接字。

# broadcast.py
from socket import *
import struct

if __name__ == "__main__":
        UDP_IP = '<broadcast>'
        UDP_PORT = 6139
        HEX = 0x2F03F4B2
        I = 0
        V = 0
        C = 0
        PAYLOAD = struct.pack("!L3i", HEX, I, V, C)
        comsocket = socket(AF_INET, SOCK_DGRAM) 
        comsocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
        comsocket.sendto(PAYLOAD, (UDP_IP, UDP_PORT))
        data, wherefrom = comsocket.recvfrom(1024, 0)
        print data, wherefrom
        comsocket.close()

这是发送回广播套接字的监听器:

import socket
from socket import *
import struct
import sys

if __name__ == "__main__":
    UDP_IP = ""
    UDP_PORT = 6139

    inbound = socket(AF_INET, SOCK_DGRAM)
    inbound.bind((UDP_IP, UDP_PORT))

    while True:
        data, wherefrom = inbound.recvfrom(1024, 0)
        data = struct.unpack("!L3i", data)
        data = str(data)
        sys.stderr.write(repr(wherefrom) + "\n")
        sys.stderr.flush()
        sys.stdout.write(data + "\n")
        sys.stdout.flush()
        inbound.sendto('lala', wherefrom)
        print wherefrom