各自的特点:

各自的特点
  •      单播:点对点      --数据报发送方式只有一个接收方
     广播:点对局域网所有的主机    --同时发给局域网中的所有主机,只有用户数据报套接字才能广播(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
原文地址:https://www.cnblogs.com/otaku-lip/p/4764944.html