我有个项目使用UDP广播的功能。广播地址使用“255.255.255.255”可以广播,使用“10.73.255.255”这个广播地址其他的设备收不到广播内容,但是抓包显示确实已经发送的目的IP是“10.73.255.255”这个广播地址了。
我的IP是10.73.2.136和10.73.2.146,子网掩码是255.255.240.0。对应的广播地址是10.73.255.255。
下面是我的代码部分:
UDP服务器发送部分
#include<iostream>
#include<stdio.h>
#include<sys/socket.h>
#include<unistd.h>
#include<sys/types.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#define MCAST_ADDR "10.73.255.255"
using namespace std;
int main()
{
setvbuf(stdout,NULL,_IONBF,0);
fflush(stdout);
int sock=-1;
if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
cout<<"sock error"<<endl;
return -1;
}
const int opt=-1;
int ret=0;
ret=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt));//设置套接字类型
if(ret==-1)
{
cout<<"set socket error...\n"<<endl;
return -1;
}
struct sockaddr_in addrto;
bzero(&addrto,sizeof(struct sockaddr_in));
addrto.sin_family=AF_INET;
//addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST);//套接字地址为广播地址
addrto.sin_addr.s_addr=inet_addr(MCAST_ADDR);
addrto.sin_port=htons(6000);//套接字广播端口号为6000
int nlen=sizeof(addrto);
while(1)
{
sleep(1);
char msg[]={"the message broadcast"};
ret=sendto(sock,msg,strlen(msg),0,(sockaddr*)&addrto,nlen);//向广播地址发布消息
if(ret<0)
{
cout<<"send error...\n"<<endl;
return -1;
}
else
{
printf("ok\n");
}
}
return 0;
}
客户端代码:
#include<iostream>
#include<stdio.h>
#include<sys/socket.h>
#include<unistd.h>
#include<sys/types.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
using namespace std;
int main()
{
setvbuf(stdout,NULL,_IONBF,0);
fflush(stdout);
int sock=-1;
if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
cout<<"socket error..."<<endl;
return -1;
}
const int opt=-1;
int nb=0;
nb=setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&opt,sizeof(opt));
if(nb==-1)
{
cout<<"set socket errror..."<<endl;
return -1;
}
struct sockaddr_in addrto;
bzero(&addrto,sizeof(struct sockaddr_in));
addrto.sin_family=AF_INET;
addrto.sin_addr.s_addr=htonl(INADDR_ANY);
addrto.sin_port=htons(6000);
socklen_t len=sizeof(addrto);
if(bind(sock,(struct sockaddr*)&(addrto),len)==-1)
{
cout<<"bind error..."<<endl;
return -1;
}
char msg[100]={0};
while(1)
{
int ret=recvfrom(sock,msg,100,0,(struct sockaddr*)&addrto,&len);
if(ret<=0)
{
cout<<"read error..."<<endl;
}
else
{
char p[64];
inet_ntop(AF_INET, &addrto.sin_addr.s_addr, p, 16);
cout<<"IP:"<<p<<" msg:" <<msg<<endl;
}
sleep(1);
}
return 0;
}