我有一个Linux应用程序打开UDP套接字并将其绑定到端口。我通过套接字发送单播数据包没有任何问题。我有机会发送一个广播数据包,所以我启用了SO_BROADCAST,允许广播数据包通过,但后来我注意到单播数据包也在广播。这是UDP套接字的预期行为,还是我更有可能错误配置了什么?
答案 0 :(得分:2)
据我所知,SO_BROADCAST是一个套接字选项。因此,如果您在套接字上启用它,则此套接字将进行广播。如果你想用同一个代码进行单播和广播,我想你需要打开不同的套接字。
答案 1 :(得分:0)
我在这方面没有做太多的编程,但你可能需要提供有关库,操作系统版本,代码等的更多信息。也许是代码示例?
如果我记得我读过的书,如果你在套接字上设置了标志,那将影响从套接字发送的所有数据报,因为套接字基本上是网络标志的数据结构+文件描述符。 / p>
答案 2 :(得分:-1)
我在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()
的给定地址上广播。