• 各自的特点:


    各自的特点
    •      单播:点对点      --数据报发送方式只有一个接收方
         广播:点对局域网所有的主机    --同时发给局域网中的所有主机,只有用户数据报套接字才能广播(UDP)
         组播:点对面(一部分主机)
    1. 广播
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <errno.h>
    #include <string.h>
    #include <unistd.h>
    
    #define  LEN  128
    
    int main(int argc, const char *argv[])
    {
        
        int sockfd;
        struct sockaddr_in serveraddr;
        char buf[LEN];
    
        if(argc != 3)
        {
            fprintf(stderr, "Usage:%s serverip port.
    ", argv[0]);
            return -1;
        }
    
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sockfd < 0)
        {
            perror("fail to socket");
        }
    
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
        serveraddr.sin_port = htons(atoi(argv[2]));
    
        if(connect(sockfd, (struct sockaddr*)&serveraddr,sizeof(struct sockaddr)) < 0)
        {
            perror("connect failed.");
            return -1;
        }
    
        while(1)
        {
    
            printf("input > ");
            fgets(buf, LEN, stdin);
            if(send(sockfd, buf, sizeof(buf), 0) < 0)
            {
                perror("fail to send");
                return -1;
            }
            if(strncmp(buf,"quit", 4) == 0)
            {
                break;
            }
            if(recv(sockfd, buf, sizeof(buf), 0) < 0)
            {
                perror("fail to recv");
                return -1;
            }
            printf("buf:%s
    ", buf);
        }
    
        close(sockfd);
    
    
        return 0;
    }
    View Code
       ①使用UDP协议。
         ②地址 192.168.1.255(本网段的最大IP地址)或者 255.255.255.0
     
        广播流程
               1-- 广播发送者
                   socket  
                     |
                    /
                   填充广播信息结构体
                     |
                    /
                   setsockopt  设置广播权限
                     |
                    /
                   send        发送广播
     
     
                2-- 广播接收者
                   socket  
                     |
                    /
                   填充广播信息结构体
                     |
                    /
                    bind
                     |
                    /
                   recvfrom     接收广播
    send.c
    client.c
    2. 组播: --(又称为多播)是一种折中的方式。只有加入某个多播组的主机才能收到数据。英文:multicast
        ①也是使用的UDP协议
        ②组播地址:225.0.0.1 --  239.255.255.255 , 是D类地址的一部分
         流程:
            1-- 发送者
                创建用户数据报套接字
                     |
                    /
     
                填充组播地址
                     |
                    /
     
                指定端口信息
                     |
                    /
                发送数据包sendto
     
            2-- 接收者
                创建用户数据报套接字
                     |
                    /
     
                加入多播组
                     |
                    /
     
               绑定组播IP地址和端口
                     |
                    /
               绑定的端口必须和发送方指定的端口相同
                     |
                    /
     
               等待接收数据
     
        广播的结构体
            放到要加入的成员内,
    要包含的库:
        #include <netinet/in.h>
            struct ip_mreq                                                                                                    
            {
            /* IP multicast address of group.  */  组播的ip地址
            struct in_addr imr_multiaddr;
     
           /* Local IP address of interface.  */  本机的ip地址
           struct in_addr imr_interface;
           };
     
          mreq.imr_multiaddr.s_addr = inet_addr(“224.10.10.1”);  //组播地址
          mreq.imr_interface.s_addr = htonl(INADDR_ANY);  //INADDR_ANY  0 地址 ,任意的主机地址,当移植的时候,可以自己识别本机的主机地址
     
          setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,  sizeof(mreq));
     
    3. 网络地址分类
        0.0.0.0      任意的本机ip地址。
        127.0.0.1  本地回环地址
     
        A类
            第1字节为网络地址,其他3个字节为主机地址,第1字节的最高位固定为0
            第一字节的范围:0000 0000 ~ 0111 1111
            1.0.0.1 – 126.255.255.255
            
        B类
            第1字节和第2字节是网络地址,其他2个字节是主机地址。第1字节的前两位固定为10
            10 00 0000  0000 0000  ~ 10 11 1111  1111 1111
            128.0.0.1 – 191.255.255.255
        C类
            前3个字节是网络地址,最后1个字节是主机地址。第1字节的前3位固定为110
            1100 0000 0000 0000 0000 0000 ~ 1101 1111 1111 1111 1111 1111
            192.0.0.1 – 223.255.255.255
        D类: --(组播地址
            不分网络地址和主机地址,第1字节的前4位固定为1110
           224.0.0.1 – 239.255.255.255
           组播地址:225.0.0.1 --  239.255.255.255
        E类: --(保留地址)
            240.0.0.1 - 255.255.255.255
  • 相关阅读:
    [Javascript] Broadcaster + Operator + Listener pattern -- 9. Create modify, filter, map operators
    [Javascript] Broadcaster + Operator + Listener pattern -- 8. Pass a Done Symbol when an Async Function is Done
    [Javascript] Broadcaster + Operator + Listener pattern -- 7. Create a broadcaster forOf
    [Javascript] Broadcaster + Operator + Listener pattern -- 6. Create a Buffer to Pair Values Together with Zip
    [Functional Programming] Match Function Requirements with Lodash Partial and Flip
    [Javascript] Broadcaster + Operator + Listener pattern -- 5. Merge (Example)
    [React] Performance: Split state update and component render with Hoc
    [React] Optimize context value
    [React] useAsync
    Nodejs.sublime-build 在sublime3中的配置
  • 原文地址:https://www.cnblogs.com/otaku-lip/p/4764944.html
Copyright © 2020-2023  润新知