UDP通过同一个套接字广播和单播?

时间:2009-04-28 23:44:56

标签: linux sockets udp broadcast

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

3 个答案:

答案 0 :(得分:2)

据我所知,SO_BROADCAST是一个套接字选项。因此,如果您在套接字上启用它,则此套接字将进行广播。如果你想用同一个代码进行单播和广播,我想你需要打开不同的套接字。

答案 1 :(得分:0)

我在这方面没有做太多的编程,但你可能需要提供有关库,操作系统版本,代码等的更多信息。也许是代码示例?

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

答案 2 :(得分:-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)
  4.   
        
          

    bindaddr.sin_family = AF_INET

                 

    bindaddr.sin_port = <YourPort>

                 

    bindaddr.sin_addr.s_addr = INADDR_ANY

        
      
    • <YourPort>
    • 的任意卡片上获取所有收到的消息

    需要注意的是,没有过滤(请参阅3中的警告)。所以你会得到所有的消息。 已发送的消息要么是单播的,要么是在sendto()的给定地址上广播。