【1】组播
单播方式只能发给一个接收方。
广播方式发给所有的主机。过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。
组播(又称为多播)是一种折中的方式。只有加入某个多播组的主机才能收到数据。
多播方式既可以发给多个主机,又能避免象广播那样带来过多的负载(每台主机要到传输层才能判断广播包是否要处理)
【2】网络地址
A类地址
第1字节为网络地址,其他3个字节为主机地址。第1字节的最高位固定为0
1.0.0.1 – 126.255.255.255
0000 0000 -- 0111 1111 0 到 127
0 网段,作为保留地址
127 网段 ,作为保留地址
0.0.0.0 代表任意的本机IP地址
B类地址
第1字节和第2字节是网络地址,其他2个字节是主机地址。第1字节的前两位固定为10
128.0.0.1 – 191.255.255.255
10 00 0000 0000 0000 -- 1011 1111 1111 1111 范围 128.0 -- 191.255
C类地址
前3个字节是网络地址,最后1个字节是主机地址。第1字节的前3位固定为110
192.0.0.1 – 223.255.255.255
1100 0000 0000 0000 0000 0000 -- 110 1 1111 1111 1111 1111 1111 范围 192.0.0 -- 223.255.255
D类地址(组播地址)
不分网络地址和主机地址,第1字节的前4位固定为1110
224.0.0.1 – 239.255.255.255
224.0.0.1 -- 224.255.255.255 也是保留的地址(部分保留)
E类地址
保留地址
【3】组播编程流程
发送者流程:
1-- 创建用户数据报套接字
socket();
2-- 填充组播信息结构体
接收方地址指定为组播地址
指定端口信息
3-- 发送数据包
sendto()
接收者流程:
1-- 创建用户数据报套接字
socket();
2-- 加入多播组
/* IPv4 multicast request. */
struct ip_mreq
{
/* 组播的IP地址 */
struct in_addr imr_multiaddr;
/* 本地的IP地址 */
struct in_addr imr_interface;
};
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = ...;
mreq.imr_interface.s_addr = ...;
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP, &mreq ,sizeof(mreq));
3-- 绑定
绑定组播IP地址和端口
绑定的端口必须和发送方指定的端口相同
4-- 等待接收数据
【4】UNIX域套接字
socket同样可以用于本地通信
创建套接字时使用本地协议PF_UNIX(或PF_LOCAL)。
分为流式套接字和用户数据报套接字
和其他进程间通信方式相比使用方便、效率更高
常用于前后台进程通信
struct sockaddr_un
{
__SOCKADDR_COMMON (sun_);
char sun_path[108]; /* Path name. */
};