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或同网段内的广播地址的时候,服务器端都收不到信息,那么客户端也不知道服务器的地址了;为了验证是否程序有问题,把广播地址改为服务器的地址时,发送和接收信息都正常。那么,郁闷了,问题出在哪里呢???

第1个回答  2010-05-18
说明:把广播地址改为服务器地址时接收正常 ?
如果接收正常就OK了?你发送到广播地址,接收到的是服务器发出的.

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

要不然就是你没有说清楚

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

你希望服务器收到自己的广播?那个不是保证可以正确的。不一定会收到几个,也可能没有。本回答被网友采纳
第2个回答  2015-08-01
你好 我现在虚拟机linux 发送广播 在win接收不到广播。 win发送广播虚拟机linux能接收到,请问一下,怎么回事啊。
第3个回答  2013-04-12
遇到同样的问题,UDP中单项发送的时候我能收到,广播时我就收不到。请问楼主解决了吗,解决了通知一下啊。我QQ273889196,可以QQ上交流。

我的问题已经解决了,是广播地址的问题,建议你上网好好查查,广播地址不一定是255的!!!
第4个回答  2010-05-17
不同子网的广播地址可能不同
好的风格是不在程序中写死地址
具体的广播地址可以用ifconfig 查看

linux下的UDP通讯怎么接受不到广播
说明:把广播地址改为服务器地址时接收正常 ?如果接收正常就OK了?你发送到广播地址,接收到的是服务器发出的.发送 -> to 255.255.255.255 接受 -> bind 0.0.0.0 -> from server_addr 要不然就是你没有说清楚 --- 你希望服务器收到自己的广播?那个不是保证可以正确的。不一定会收到几个,...

我在linux环境下编写udp客户端程序。为什么使用sendto发送数据时,接收...
1、检查客户端和服务端的端口号是否一致;2、接收端的socket要采用block模式,数据收到后打印出来.

linux设备udp不能跨网段
如果在Linux设备上使用UDP协议进行通信时,发现无法跨网段进行通信,可能是以下原因导致:1、设备网络配置问题。如果设备的网络设置不正确,可能会导致跨网段通信失败。请检查设备的IP地址、子网掩码、网关等网络参数是否设置正确。2、防火墙问题。如果设备的防火墙设置不正确,可能会阻止UDP数据包的传输。请检...

如何在Linux中打开UDP网络协议linux打开udp
首先,需要确认Linux系统中是否已安装好UDP协议,可以使用以下命令:`# ls \/proc\/sys\/net\/unix`如果存在udp目录,则说明UDP网络协议已安装完成。其次,要在Linux系统中启用UDP协议,可以使用以下命令:`# sysctl -w net.ipv4.ip_forward=1`这条命令会启用Linux系统中的UDP协议,从而确保UDP协议可以正常...

关于udp发broadcast广播包sendto返回-1
最近在调试linux下的udp广播,发现当addr设置成server.sin_addr.s_addr = INADDR_BROADCAST;时候,调用sendto返回-1,在网上找了好多资料都没结果。后来无意间发现原来调用 res = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &server, sizeof(server))因为默认情况下套接字是不指出广播的,必须设置...

linux测试udp端口命令linux测试udp
所以根据telnet的命令可以判断端口通不通。还可以使用nmap命令去测试端口通不通。nmap可以测试TCP和UDP端口。具体方法是:nmap-sT101.200.188.138-p22测试TCP端口,把IP和端口号换成自己需要测试的就行。linux检查端口命令?linux查看端口的命令:第一种:lsof-i:端口号 第二种:netstat-nltp|grep端口...

linux发送udp广播包linuxudp广播
broadcast广播:一种发送形式,即一个包的副本发送到网上的每一台计算机。参阅cluster,multicast和Unicast。 broad TCP和UDP的区别是什么? 1、连接方面区别TCP面向连接(如打电话要先拨号建立连接)。UDP是无连接的,即发送数据之前不需要建立连接。 2、安全方面的区别TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢...

如何在路由器上测试远端UDP端口通不通
这个他们拓扑大概是防火墙-路由器-交换机-PC,我的思路是分别在每台设备上测试看看远端的UDP端口能不能通,找到哪台设备不通就检查配置看看他前面的设备或者他做了什么配置导致不通,我现在就不知道怎么在路由器啊,交换机上去测试对端UDP端口通不通。

linux查看本地一个udp端口有没有接收到数据包
使用如下命令: tcpdump udp port 200

单片机如何实现UDP广播发送
没弄过,udp广播只在linux里面用socket实现过。只能给你个思路:首先实现网络接口的数据收发,然后在此基础上实现IP协议,在IP协议基础上研究udp广播的发送方式,然后实现udp广播收发就算可以了。由于udp广播发送是单工通信,像tcp得三次握手啊之类的都不需要,所以实现起来还是较简单的。

相似回答