Python和UDP侦听

Python和UDP侦听,python,udp,Python,Udp,我有一个应用程序,软件定义的无线电,它在一个端口上广播UDP数据包,告诉听众设置了什么频率和解调模式(除其他外) 我已经编写了一个演示python客户端(下面的代码),它侦听端口,并将相应数据包中的信息转储到控制台 它们都在OSX 10.6下运行,雪豹。他们在那里工作 我的问题是:Python应用程序必须在radio应用程序之前启动,或者它声称绑定期间端口已经在使用(ERRNO 47),我不明白为什么。无线电应用程序正在播放UDP;当然,我想容纳多个听众——这就是广播的想法,或者至少,我是这么想

我有一个应用程序,软件定义的无线电,它在一个端口上广播UDP数据包,告诉听众设置了什么频率和解调模式(除其他外)

我已经编写了一个演示python客户端(下面的代码),它侦听端口,并将相应数据包中的信息转储到控制台

它们都在OSX 10.6下运行,雪豹。他们在那里工作

我的问题是:Python应用程序必须在radio应用程序之前启动,或者它声称绑定期间端口已经在使用(ERRNO 47),我不明白为什么。无线电应用程序正在播放UDP;当然,我想容纳多个听众——这就是广播的想法,或者至少,我是这么想的

下面是Python代码(缩进有点混乱,因为堆栈溢出的“makeit-code”缩进非常愚蠢,但我向您保证它没有问题):

以下是发送UDP消息的Qt代码供参考:

设置:

bcast = new QHostAddress("192.168.1.255");
if (bcast)
{
    udpSocketSend = new QUdpSocket(0);
    if (udpSocketSend)
    {
        udpSocketSend->bind(*bcast, txudp);
    }
}
广播:

if (udpSocketSend)
{
    QByteArray *datagram = new QByteArray(1024,0);  // datagram is full of zeroes
    strcpy(datagram->data(),msg);                   // except where text message is in it at beginning
    udpSocketSend->writeDatagram(*datagram, QHostAddress::Broadcast,txudp); // send
}

您尝试绑定同一端口,两次

在发件人中绑定一次:

if (udpSocketSend)
{
    udpSocketSend->bind(*bcast, txudp);
}
再一次对着听筒

s.bind(('', port))
因为这些都在同一台机器上运行,所以您会得到一个错误

除非您关心源端口是什么,否则不需要对发送方执行
bind()
,只要发送它,堆栈就会选择一个合适的传出源端口号。对于发送方,在传输UDP数据报时,指定目的地(
udpSocketSend->writeDatagram(…)
),并且
bind
实际确定传出数据报的源。如果不绑定,那么堆栈将为您分配一个端口

如果您确实关心源端口是什么,那么我建议您对传出源端口和传入目标端口使用不同的端口号。然后您就可以绑定发送方和接收方而不会出现问题


最后,还有一个选项可以设置
SO\u REUSEADDR
socket选项(使用任何语言)。如果要在同一台计算机上运行多个客户端,这是必需的,因为所有客户端都必须绑定到同一地址。但是,我不确定这个套接字选项是否是跨平台的(*nix工作正常),我认为上面的建议更好。

这两个应用程序在同一台机器上运行,是吗?您需要修复缩进。在
try:
之后,不能有与
try:
语句具有相同缩进级别的行。@jedwards,是的。ThiefMaster:正如我在Python代码上面明确指出的,stackoverflow的格式将缩进搞乱了。代码缩进正确。不必担心。+1,但为了完全明确起见,在TCP/IP通信中,您几乎从不关心源端口是什么。你唯一关心的是你是否在试图协商一套特定的防火墙规则。拉塞尔:这是UDP。不是TCP@jedwards:我需要(单个)应用程序发送可以被多个客户端接收的广播。我需要客户端——可能有几个客户端——能够向应用程序发送消息。在任何情况下,我都不希望用户实际必须进行任何设置。广播的想法似乎是两全其美的(而且似乎没有其他东西是真的)。我错了吗?
s.bind(('', port))