linux下的UDP通讯怎么接受不到广播

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下的UDP通讯怎么接受不到广播相关的知识,希望对你有一定的参考价值。

我写的是个多客户端通过服务器中转信息的简易程序,但是在广播的时候出现问题(说明:把广播地址改为服务器地址时接收正常)
下面是广播程序:
void broad_cast()

int len = sizeof(struct sockaddr);
int broad_flag = 1;
setsockopt(sock_fd,SOL_SOCKET,SO_BROADCAST,&broad_flag,sizeof(int));

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(6789);
serv_addr.sin_addr.s_addr = inet_addr("255.255.255.255");
send_msg.flag = 0;
strcpy(send_msg.msg_buf,"it's a broadcast");
send_msg.msg_len = (4 + sizeof(unsigned long) * 2 + 4 +strlen(send_msg.msg_buf) + 1);

sendto(sock_fd,(void *)&send_msg,send_msg.msg_len,0,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr));

recvfrom(sock_fd,(void *)&msg,sizeof(struct udp_pack_info),0,(struct sockaddr *)&serv_addr,&len);
printf("msg:%s\n",msg.msg_buf);
broad_flag = 0;
setsockopt(sock_fd,SOL_SOCKET,SO_BROADCAST,&broad_flag,sizeof(int));

服务器程序(节选):
sock_fd = socket(AF_INET,SOCK_DGRAM,0);
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(6789);
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

if( bind(sock_fd,(void *)&serv_addr,sizeof(struct sockaddr_in)) < 0)

perror("bind");
return -1;

while(1)

recvfrom(sock_fd,(void *)&msg,sizeof(struct udp_pack_info),0,(struct sockaddr *)&cli_addr,&len);
sendto(sock_fd,(void *)&msg,msg.msg_len,0,(struct sockaddr *)&cli_addr,sizeof(struct sockaddr));
广播的目的是希望可以获得服务器的地址信息,但是用255.255.255.255或同网段内的广播地址的时候,服务器端都收不到信息,那么客户端也不知道服务器的地址了;为了验证是否程序有问题,把广播地址改为服务器的地址时,发送和接收信息都正常。那么,郁闷了,问题出在哪里呢???

参考技术A 说明:把广播地址改为服务器地址时接收正常 ?
如果接收正常就OK了?你发送到广播地址,接收到的是服务器发出的.

发送 -> to 255.255.255.255
接受 -> bind 0.0.0.0 -> from server_addr

要不然就是你没有说清楚

---------------------------

你希望服务器收到自己的广播?那个不是保证可以正确的。不一定会收到几个,也可能没有。
参考技术B 你好 我现在虚拟机linux 发送广播 在win接收不到广播。 win发送广播虚拟机linux能接收到,请问一下,怎么回事啊。 参考技术C 遇到同样的问题,UDP中单项发送的时候我能收到,广播时我就收不到。请问楼主解决了吗,解决了通知一下啊。我QQ273889196,可以QQ上交流。

我的问题已经解决了,是广播地址的问题,建议你上网好好查查,广播地址不一定是255的!!!
参考技术D 不同子网的广播地址可能不同
好的风格是不在程序中写死地址
具体的广播地址可以用ifconfig 查看

以上是关于linux下的UDP通讯怎么接受不到广播的主要内容,如果未能解决你的问题,请参考以下文章

求一linux接收udp广播程序(提供模板)

Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端

Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端

Android Socket UDP 点对点,或者广播通讯,包含发送端和接收端

udp为啥收不到广播中的数据,该怎么处理

udp 能跨网段广播 谁能告诉我udp跨网段怎么发消息,比如192.168.2.1到192.168.13.2去 c#的