【问题标题】:UDP broadcast and unicast through the same socket?UDP广播和单播通过同一个套接字?
【发布时间】:2010-10-22 11:12:28
【问题描述】:

我有一个 Linux 应用程序,它打开一个 UDP 套接字并将其绑定到一个端口。我通过套接字发送单播数据包没有任何问题。我有机会发送一个广播数据包,所以我启用了 SO_BROADCAST,它允许广播数据包通过,但随后我注意到单播数据包也在广播。这是 UDP 套接字的预期行为,还是更有可能是我配置错误?

【问题讨论】:

    标签: linux sockets udp broadcast


    【解决方案1】:

    我在 Linux 上发现了同样的问题,即让套接字同时获得单播和广播。我解决了如下问题(伪代码):

    1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
      • 打开套接字
    2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
      • 允许从此套接字传入和传出广播
    3. bind(sock, bindaddr, sizeof(struct sockaddr)

    bindaddr.sin_family = AF_INET

    bindaddr.sin_port = <YourPort>

    bindaddr.sin_addr.s_addr = INADDR_ANY

    • 获取<YourPort> 的任何卡上的所有传入消息

    需要注意的是没有过滤(请参阅 3. 中的注意事项)。因此,您将收到所有消息。 根据sendto() 中的给定地址,发送的消息要么是单播的,要么是广播的。

    【讨论】:

    • 你能解释一下 &1 是什么意思吗?
    【解决方案2】:

    据我了解SO_BROADCAST 是一个套接字选项。所以如果你在你的套接字上启用它,这个套接字就会广播。如果你想从相同的代码进行单播和广播,我想你需要打开不同的套接字。

    【讨论】:

    • 谢谢。这就是我一直在挖掘的。我想我期待它做一些它不打算做的事情。第二个套接字应该可以解决问题,尽管我猜我必须绑定到第二个端口(无赖)。
    【解决方案3】:

    我在这里没有做过很多编程,但您可能需要提供更多关于库、操作系统版本、代码等的信息。也许是代码示例?

    如果我记得我读过的书,如果你在套接字上设置了标志,那将影响从套接字发送的所有数据报,因为套接字基本上是一个网络标志+文件描述符的数据结构。

    【讨论】:

      猜你喜欢
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多