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

c++
ma950924
程序猿之杰克马 有人知道为什么“255.255.255.255”可以,“10.73.255.255”就不可以的原因吗?前面是当前局域网内所有的设备都能收到,后面是只能在10.73这个网段的设备才能收到,但是测试显示这个网段的设备并没有收到
6 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!