生命如歌,代码如诗 2019-05-30 13:57 采纳率: 0%
浏览 288
已结题

关于使用对应的广播地址,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;
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 已结题 (查看结题原因) 5月12日

    悬赏问题

    • ¥50 永磁型步进电机PID算法
    • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
    • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
    • ¥15 如何处理复杂数据表格的除法运算
    • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥200 uniapp长期运行卡死问题解决
    • ¥15 latex怎么处理论文引理引用参考文献
    • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
    • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?