• C++代码实现组播及归纳的流程图


    1.流程图总结:

    2. 代码:


    //运行起来一个Sender.exe,和多个Receiver.exe,可以看到组播的效果.
    //Sender.cpp也可称为服务端
    #include <WINSOCK.H>
    #include <stdio.h>
    #define HELLO_PORT  7905    
    #define HELLO_GROUP "228.4.5.6"    
    #pragma comment(lib, "WSOCK32.lib")
    
    int main(int argc, char *argv[])    
    {    
        WSADATA     wsaData;
        WORD wVersionRequested;
        wVersionRequested = MAKEWORD(1,1);
        // Initialize Windows socket library
        WSAStartup(0x0202, &wsaData);
        struct sockaddr_in addr;    
        int fd, cnt;    
        char *message="Hello, World!";    
        /* create what looks like an ordinary UDP socket */    
        if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
        {    
            perror("socket");    
            exit(1);    
        }    
        /* set up destination address */    
        memset(&addr,0,sizeof(addr));    
        addr.sin_family=AF_INET;    
        addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);    
        addr.sin_port=htons(HELLO_PORT);    
        /* now just sendto() our destination! */    
        while (1)    
        {    
            if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)     
            {    
                perror("sendto");    
                exit(1);    
            }    
            printf("Send %s
    ",message);
            Sleep(1000);    
        }    
        return 0;    
    }
    //Receiver.cpp也可称为客户端
    #include <WINSOCK.H>
    #include <stdio.h>
    #define HELLO_PORT  7905    
    #define HELLO_GROUP "228.4.5.6"    
    #define MSGBUFSIZE 256    
    #pragma comment(lib, "WSOCK32.lib")
    int main(int argc, char *argv[])    
    {    
        WSADATA     wsaData;
        WORD wVersionRequested;// Version
        wVersionRequested = MAKEWORD(1,1);//Version Info
        // Initialize Windows socket library
        WSAStartup(wVersionRequested, &wsaData);
        struct sockaddr_in addr;    
        int fd, nbytes,addrlen;    
        struct ip_mreq mreq;    //组播结构体
        char msgbuf[MSGBUFSIZE];    
        u_int yes=1; /*** MODIFICATION TO ORIGINAL */    
        /* create what looks like an ordinary UDP socket */    
        if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     //SOCK_DGRAM基于UDP,专门用于局域网.       
        {    
            perror("socket");    
            exit(1);    
        }    
        /**** MODIFICATION TO ORIGINAL */    
        /* allow multiple sockets to use the same PORT number */    
        if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes)) < 0)     
        {    
            perror("Reusing ADDR failed");    
            exit(1);    
        }    
        /*** END OF MODIFICATION TO ORIGINAL */    
        /* set up destination address */    
        memset(&addr,0,sizeof(addr));    
        addr.sin_family=AF_INET;    
        addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */    //本地的端口
        addr.sin_port=htons(HELLO_PORT);       //这个端口必须和组播的端口一致
    //     addr.sin_port=htons(5000);    
    
        /* bind to receive address */    
        if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)    
        {    
            perror("bind");    
            exit(1);    
        }    
        /* use setsockopt() to request that the kernel join a multicast group */    
        mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);  //组播组的ip地址  
        mreq.imr_interface.s_addr=htonl(INADDR_ANY);       //加入的客户端主机的ip地址  INADDR_ANY为0.0.0.0,泛指本机,表示本机所有的ip.
    
        //客户端只有在加入多播组后才能接受多播组的数据
        if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)   //IP_ADD_MEMBERSHIP:加入组播组
        {    
            int err=GetLastError();
            printf("setsockopt:%d",err);    
            exit(1);    
        }    
        /* now just enter a read-print loop */    
        while (1)     
        {    
            //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);    
            addrlen=sizeof(addr);  
            printf("Receiving..."); 
            //if((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,NULL,NULL))<0)
            if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (int *)&addrlen)) < 0)     //addr:指向装有源地址的缓冲区  addrlen:指向缓冲区的长度
            {    
                perror("recvfrom");    
                exit(1);    
            } msgbuf[nbytes]  =''; 
            printf("%s, RECEIVED FROM:%s
    ",msgbuf, inet_ntoa(addr.sin_addr));    
        }    
        return 0;    
    }
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    (qsf文件 、 tcl文件 和 csv(txt)文件的区别) FPGA管脚分配文件保存、导入导出方法
    VC++从入门到精通视频教程网址
    STM32F103 与 STM32F407引脚兼容问题
    Modelsim初级使用教程
    对数的计算公式
    NTC(负温度)热敏电阻.阻值的计算方式
    iOS 添加导航按钮
    isKindOfClass,isMemberOfClass使用备忘
    iOS 添加手机密码、指纹进行安全验证
    NSString的几个方法(rangeOfString,hasPrefix,hasSuffix,改变大小写...)
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/12423270.html
Copyright © 2020-2023  润新知