【问题标题】:UDP broadcasts aren't being sent on specific occasionsUDP 广播未在特定场合发送
【发布时间】:2014-06-24 08:26:26
【问题描述】:

我遇到了这种奇怪的情况:

这就是我为广播设置 UDP 套接字的方式:

int broadcast_enable = 1;
int my_socket;

if ((my_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {

    fprintf(stderr, "ERROR socket\n");
    return 0;
}

memset(&my_addr, '\0', sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
my_addr.sin_port = htons(20007);

setsockopt(my_socket, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable));

这就是我通过这个套接字发送消息的方式:

int len = sizeof(my_addr);
char buff;

buff = 'b';

if (sendto(my_socket, &buff, sizeof(buff), 0, (struct sockaddr*)&my_addr, len) < 0) {

    fprintf(stderr, "ERROR sendto\n");
    return 0;
}

我把WireShark放在发送电脑上,听wifi接口。
1. 当我连接到网络“A”时,我可以看到发件人发送的消息。
2. 当我连接到网络“B”时,我看不到发件人发送的消息。

  • 正在网络“B”中发送和接收其他广播消息(由其他应用程序)。
  • 发件人在网络“B”中有静态 IP。我将其更改为非静态的,并且我看到了正在发送的消息。过了一会儿,我又试了一次,它没有发送消息。我无法指出发生的变化。

它会给任何人敲响警钟吗?
请告诉您是否需要更多信息。

【问题讨论】:

    标签: c++ c linux sockets broadcast


    【解决方案1】:

    您可能错误地使用了 Wireshark,例如,查看了错误的 i/f 或错误地过滤了结果。 确保您正确使用它,或者更好的是,尝试 tcpdump 以确保您的数据包确实没有被发送:

    sudo tcpdump -i any -n udp
    

    【讨论】:

    • 我在尝试查看数据包时没有过滤器。我也试试tcpdump
    • 好吧,wireshark 没有显示真正的捕获,谢谢!
    【解决方案2】:

    您尚未指定将数据包发送到哪个接口。广播数据包仍然只发送到一个接口。

    如果我没记错的话,255.255.255.255 的默认值是带有默认路由的接口。如果您在其中一个接口上使用子网广播地址之一,则选择该接口;或者,您可以通过套接字选项显式选择一个。

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 2020-02-21
      • 2018-11-03
      • 2014-06-23
      相关资源
      最近更新 更多