各自的特点:
各自的特点:
- 单播:点对点 --数据报发送方式只有一个接收方
广播:点对局域网所有的主机 --同时发给局域网中的所有主机,只有用户数据报套接字才能广播(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.\n", 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\n", buf); } close(sockfd); return 0; }
①使用UDP协议。
②地址 192.168.1.255(本网段的最大IP地址)或者 255.255.255.0
广播流程:
1-- 广播发送者
socket
|
\ /
填充广播信息结构体
|
\ /
setsockopt 设置广播权限
|
\ /
send 发送广播
2-- 广播接收者
socket
|
\ /
填充广播信息结构体
|
\ /
bind
|
\ /
recvfrom 接收广播
send.c
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