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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了udp为啥收不到广播中的数据,该怎么处理相关的知识,希望对你有一定的参考价值。

参考技术A

  udp为什么收不到广播中的数据,该怎么处理,解答如下

    创建UDP的socket server,端口就是返回的数据包使用的端口,然后在server的接收函数里面获取,删选; 

    或者也可以直接起个原始套接字的server,接收所有的套接字流,然后根据你的返回数据包的端口慢慢删选;

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 查看

以上是关于udp为啥收不到广播中的数据,该怎么处理的主要内容,如果未能解决你的问题,请参考以下文章

android app中的服务为啥接收不到广播

C语言写的UDP客户端收不到包

VB6.0的winsock控件用UDP局域网广播数据,当数据很大时接收方报10040--数据包太大,请问怎么处理。

linux内核网络收包过程—UDP协议处理

一次UDP收不到包的问题排查

在两个单独的线程之间共享一个队列,用于在 UDP 广播服务器中接收和处理数据