Can UDP multicast sucess while offline?

138 Views Asked by At

a demo about UDP multicast,when i want to test if the code is right, I found failed ,but i think is not the problem of the code.My virtual machine is offline,so i think whether is udp cannot multicast when the machine is offline? this is my code:

//this is for receive
int main(int argc,char **argv) //My Multicast address is 224.0.0.88
{
    int udpsocket;
    int res;
    char buf[50];
    struct sockaddr_in saddr;
    struct sockaddr_in raddr;
    bzero(&saddr,sizeof(saddr));
    bzero(&raddr,sizeof(raddr));
    // 初始化地址结构体变量
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(5001);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);

    // 定义并初始化组播的结构体
    struct ip_mreq mreq;
    bzero(&mreq, sizeof mreq);
    mreq.imr_multiaddr.s_addr = inet_addr(argv[1]);  //组播地址,D类型
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);




    // 创建udp套接字
    udpsocket = socket(AF_INET,SOCK_DGRAM,0);
    if(udpsocket == -1)
    {
        perror("create udp socket failed!\n");
        return -1;
    }
    // 设置可以组播
    setsockopt(udpsocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                &mreq, sizeof mreq); 
    int ret = sizeof(struct sockaddr);
    // 绑定
    res = bind(udpsocket,(struct sockaddr *)&saddr,ret);
    if(res == -1)
    {
        perror("bind udp socket failed!\n");
        return -1;
    }

    while(1)
    {
        puts("111");
        bzero(buf,50);
        recvfrom(udpsocket,buf,50,0,(struct sockaddr *)&raddr,&ret);
        printf("message recv from %s\n",buf);
    }

    close(udpsocket);
    return 0;

}

//this is for send message
int main(int argc,char **argv)
{
    int udpsocket;
    int res;
    char buf[50];
    struct sockaddr_in saddr;

    bzero(&saddr,sizeof(saddr));

    // 初始化地址结构体变量
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(5001);
    saddr.sin_addr.s_addr = inet_addr(argv[1]);

    // 创建udp套接字
    udpsocket = socket(AF_INET,SOCK_DGRAM,0);
    if(udpsocket == -1)
    {
        perror("create udp socket failed!\n");
        return -1;
    }
    // 将套接字的属性设置为可以广播
    int on = 1;
    setsockopt(udpsocket, SOL_SOCKET, SO_BROADCAST, &on, sizeof on);
    setsockopt(udpsocket,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
    int ret = sizeof(struct sockaddr);

    while(1)
    {
        bzero(buf,50);
        printf("please input a message !\n");
        scanf("%s",buf);
        sendto(udpsocket,buf,50,0,(struct sockaddr *)&saddr,ret);
    }   

    close(udpsocket);
    return 0;

}
0

There are 0 best solutions below