过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。
A类地址
第1字节为网络地址,其他3个字节为主机地址。
第1字节的最高位固定为0
1.0.0.1 – 126.255.255.255
B类地址
第1字节和第2字节是网络地址,其他2个字节是主机地址。第1字节的前两位固定为10
128.0.0.1 – 191.255.255.255
C类地址
前3个字节是网络地址,最后1个字节是主机地址。第1字节的前3位固定为110
192.0.0.1 – 223.255.255.255
D类地址(组播地址)
不分网络地址和主机地址,第1字节的前4位固定为1110
224.0.0.1 – 239.255.255.255
0.0.0.0 --------- 代表任意的ip地址
255.255.255.255-------广播地址
127.0.0.0-127.255.255.255----------本地回环测试
流程
发送者:
创建套接字 socket( )
填充组播信息结构体 sockaddr_in
发送数据 sendto( )
接收者:
创建套接字 socket( )
填充组播信息结构体 sockaddr_in
将套接字与广组播信息结构体绑定 bind( )
设置为加入多播组 setsockopt( )
接收数据 recvfrom( )
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
struct ip_mreq mreq;
bzero(&mreq, sizeof(mreq));
mreq.imr_multiaddr.s_addr = inet_addr(“224.10.10.1”);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,sizeof(mreq));
#include <sys/socket.h>
int setsockopt(int socket, int level, int option_name,
const void *option_value, socklen_t option_len);
功能:设置一个套接字的选项
参数:
sockfd:文件描述符
level:协议层次
IPPROTO_IP IP层次
optname:选项的名称
IP_ADD_MEMBERSHIP 加入多播组
optval:设置的选项的值
struct ip_mreq
{
struct in_addr imr_multiaddr; 组播地址
struct in_addr imr_interface; 本地地址
INADDR_ANY 代表任意主机地址
};
optlen:optval的长度
返回值:
成功:0
失败:-1
eg:
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(argv[1]);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
{
perror("fail to setsockopt");
return -1;
}