【发布时间】:2010-10-22 11:12:28
【问题描述】:
我有一个 Linux 应用程序,它打开一个 UDP 套接字并将其绑定到一个端口。我通过套接字发送单播数据包没有任何问题。我有机会发送一个广播数据包,所以我启用了 SO_BROADCAST,它允许广播数据包通过,但随后我注意到单播数据包也在广播。这是 UDP 套接字的预期行为,还是更有可能是我配置错误?
【问题讨论】:
标签: linux sockets udp broadcast
我有一个 Linux 应用程序,它打开一个 UDP 套接字并将其绑定到一个端口。我通过套接字发送单播数据包没有任何问题。我有机会发送一个广播数据包,所以我启用了 SO_BROADCAST,它允许广播数据包通过,但随后我注意到单播数据包也在广播。这是 UDP 套接字的预期行为,还是更有可能是我配置错误?
【问题讨论】:
标签: linux sockets udp broadcast
我在 Linux 上发现了同样的问题,即让套接字同时获得单播和广播。我解决了如下问题(伪代码):
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
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() 中的给定地址,发送的消息要么是单播的,要么是广播的。
【讨论】:
据我了解SO_BROADCAST 是一个套接字选项。所以如果你在你的套接字上启用它,这个套接字就会广播。如果你想从相同的代码进行单播和广播,我想你需要打开不同的套接字。
【讨论】:
我在这里没有做过很多编程,但您可能需要提供更多关于库、操作系统版本、代码等的信息。也许是代码示例?
如果我记得我读过的书,如果你在套接字上设置了标志,那将影响从套接字发送的所有数据报,因为套接字基本上是一个网络标志+文件描述符的数据结构。
【讨论】: