UDP广播不会在特定时间发送

时间:2014-06-24 08:26:27

标签: c++ c linux sockets broadcast

我发生了这种奇怪的事情:

这是我为广播设置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。我将其更改为非静态,我看到了正在发送的消息。过了一会儿,我再次尝试,但没有发送消息。我无法指出发生的变化。

它对任何人都响了吗? 请告诉您是否需要任何进一步的信息。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

sudo tcpdump -i any -n udp