• C/S架构学习之组播


    • 组播:
    • 过多的广播会占用网络带宽,产生广播风暴的现象,从而影响正常的通信活动;
    • 组播(或者多播)是局域网内部的通信,只有加入到某个多播组的主机才能收到数据;
    • 组播的方式既可以发给多个主机,又能避免广播带来过多的网络负载;
    • 组播地址:D类地址:“224.0.0.1~239.255.255.254”;
    • 设置组播的流程:
    • 发送方(UDP的客户端):
    • 一、创建用户数据报套接字(socket函数):
    	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
        if(-1 == sockfd)
        {
            perror("socket error");
            exit(-1);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 二、填充组播信息结构体( struct sockaddr_in):
    	struct sockaddr_in serveraddr;
        socklen_t serveraddr_len = sizeof(serveraddr);
        memset(&serveraddr,0,serveraddr_len);
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = inet_addr(M_IP);
        serveraddr.sin_port = htons(PORT);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 三、发送组播信息(sendto函数):
    	char buf[128] = {0};
        while(true)
        {
            memset(buf,0,sizeof(buf));
            fgets(buf,128,stdin);
            buf[strlen(buf)-1] = '\0';
            if(!strncmp(buf,"quit",4))
            {
    
                break;
    
            }
    
            //给服务器发送数据
            if(-1 == (sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&serveraddr,serveraddr_len)))
            {
                perror("sendto error");
                exit(-1);
    
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 四、关闭用户数据报套接字(close函数):
     	close(sockfd);
    
    • 1
    • 接收方(UDP的服务器):
    • 一、创建用户数据报套接字(socket函数):
    	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
        if(-1 == sockfd)
        {
            perror("socket error");
            exit(-1);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 二、填充组播信息结构体(struct sockaddr_in):
    	struct sockaddr_in serveraddr,clientaddr;
        socklen_t serveraddr_len = sizeof(serveraddr);
        socklen_t clientaddr_len = sizeof(clientaddr);
        memset(&serveraddr,0,serveraddr_len);
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = inet_addr(M_IP);
        serveraddr.sin_port = htons(PORT);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 三、用户数据报套接字和广播信息结构体绑定(bind函数):
    	if(-1 == (bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len)))
        {
            perror("bind error");
            exit(-1);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 四、设置加入多播组(setsockopt函数):
    	struct ip_mreqn {
    
            struct in_addr imr_multiaddr; 
            struct in_addr imr_address;   
            int            imr_ifindex;   
    
        };
        struct ip_mreqn multi_group;
        multi_group.imr_address.s_addr = INADDR_ANY;
        multi_group.imr_multiaddr.s_addr = inet_addr(M_IP);
        multi_group.imr_ifindex = 0;
    
        if(-1 == (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&multi_group,sizeof(multi_group))))
        {
    
            perror("setsockopt error");
            exit(-1);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 五、接收组播信息(recvfrom函数):
    	char buf[128] = {0};
        while(true)
        {
            memset(buf,0,sizeof(buf));
            if(-1 == recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,&clientaddr_len))
            {
                perror("recvfrom error");
                exit(-1);
            }
            printf("客户端[%s:%d]发来数据[%s]\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),buf);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 六、关闭用户数据报套接字(close函数):
     	close(sockfd);
    
    • 1
  • 相关阅读:
    flask入门
    [Linux]cp -rf无效
    学习Java编程入门书籍
    Java Day1
    地方(少数民族)节假日
    L2-024 部落
    JSON&redis
    uni-app的优缺点;uniapp进行条件编译的两种方法;小程序端和H5的代表值
    最优化建模、算法与理论(二)—— 典型优化问题
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-39-highlight() 方法之追踪定位
  • 原文地址:https://blog.csdn.net/qq_41878292/article/details/134217603