组播

过多的广播会大量占用网络带宽,造成广播风暴,影响正常的通信。

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
{
  /* IP multicast address of group.  */
  struct in_addr imr_multiaddr;     //组播地址  224.0.0.1-239.255.255.255                                      

  /* Local IP address of interface.  */ 
  struct in_addr imr_interface;  //本地接口的IP地址
};

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);  //指定本地接口的IP   INADDR_ANY(0)---》ipv4的通配地址  由内核选择一个ip地址  

//加入多播组-----》IP_ADD_MEMBERSHIP
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值