ma950924
2019-05-30 13:57 阅读 229

关于使用对应的广播地址,UDP广播失败

我有个项目使用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;
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

相关推荐