【问题标题】:Broadcasting UDP message from C# to Python将 UDP 消息从 C# 广播到 Python
【发布时间】:2015-02-03 22:17:13
【问题描述】:

我正在尝试将广播消息从一台机器上的 C# 应用程序发送到另一台机器上的 Python 脚本。如果我指定 Python 机器的 IP 作为我的端点,我可以发送消息就好了。以下是我发送消息的方式:

const int PORT = 12345;
using (var sock = new UdpClient())
{
    var endpoint = new IPEndPoint(IPAddress.Parse(remoteIP), PORT);
    //var endpoint = new IPEndPoint(IPAddress.Broadcast, PORT);

    byte[] bytes = Encoding.UTF8.GetBytes("hello, world!");
    sock.Send(bytes, bytes.Length, endpoint);
}

在 Python 方面,我收到如下信息:

import socket
PORT = 12345

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', PORT))
#sock.bind(('<broadcast>', PORT))

while 1:
    data,addr = sock.recvfrom(1024)
    if not data: break
    print(data)

我可以成功地将我的消息从一台机器发送到另一台机器。但是,我有多台机器希望我的消息发送到(UDP 广播),但是当我使用IPAddress.Broadcast 作为我的端点时,Python 没有收到我的消息。我也尝试将我的 Python 套接字绑定到 &lt;broadcast&gt;,但这并没有帮助,绑定到我的 C# 机器的 IP 给了我错误 socket.gaierror: [Errno -3] Temporary failure in name resolution

我不知道这是 C# 没有发送广播还是 Python 没有接收到它的问题。

【问题讨论】:

    标签: c# python udp broadcast


    【解决方案1】:

    您可以使用网络分析器(例如 Wireshark)来验证您的网络代码的操作。我怀疑如果你这样做了,你会发现实际上并没有设置广播数据报。

    缺少a good, complete code example 很难确定原因是什么。但是造成这种情况的原因很可能是因为您没有为您的套接字设置Socket.EnableBroadcast 属性。默认为false,如果不设置为true,即使发送到广播地址也不会发送广播数据报。

    【讨论】:

    • 代码证明是有效的,但有一个例外:我使用的广播地址将数据包路由到我的 Windows Phone 网络设备模拟器。 Wireshark 确实帮助我找到了这个问题。我发现点对点消息可以正常工作,因为它被路由到我的虚拟交换机;广播,OTOH,被 WP 模拟器丢弃。我手动将我的广播设置为与目标机器的 IP 地址相或的子网的反码。
    • 将您的答案标记为已接受,因为 Wireshark 最终确实让我得到了答案。谢谢!
    猜你喜欢
    • 2012-09-17
    • 1970-01-01
    • 2019-05-12
    • 2014-03-12
    • 1970-01-01
    • 2017-04-19
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多