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

1.流程图总结:

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

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 %sn",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:%sn",msgbuf, inet_ntoa(addr.sin_addr));    
    }    
    return 0;    
}

原文链接: https://www.cnblogs.com/Stephen-Qin/p/12423270.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/193978

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午6:32
下一篇 2023年2月12日 下午6:33

相关推荐