静态网站后台,半江红网站建设,wordpress编辑器无法实现随意排版,长沙银狐做网站目录
1. 多播
1.1 多播的使用情形
1.2 多播的原理
1.3 如何实现多播
1.4 多播的代码实现
2. 广播
2.1 广播与多播的区别
2.2 广播的分类
2.3 实现广播 1. 多播
1.1 多播的使用情形 考虑一种情形#xff0c;你要向10000名用户发送数据#xff0c;此时如果用TCP提供服…目录
1. 多播
1.1 多播的使用情形
1.2 多播的原理
1.3 如何实现多播
1.4 多播的代码实现
2. 广播
2.1 广播与多播的区别
2.2 广播的分类
2.3 实现广播 1. 多播
1.1 多播的使用情形 考虑一种情形你要向10000名用户发送数据此时如果用TCP提供服务则需要维护10000个套接字连接如果用UDP提供服务则也需要进行10000次数据传输。像这样在这总情况下就可以使用多播技术来解决问题。所以一般多播常用于多媒体数据的实时传输。
1.2 多播的原理 多播是基于UDP协议传输的。但又与UDP有一些不同不同之处在于UDP数据传输是以单一目标进行的而多播则会将数据同时传递到加入(注册)多播组的大量主机。 其中多播组是一种D类IP地址(224.0.0.0~239.255.255.255)加入多播组可以理解为在D类IP地址中我希望接收发往目标239.255.255.255的多播数据。 其原理如图 多播数据包的格式与UDP数据包相同但多播数据包在传输过程中时路由器会复制该多播数据包并传递到多个主机。由此主机只需要发送一次数据包多个主机就能接受到而无需一个数据包发多次。不像UDP或TCPn个主机要接受数据包就得传输n次。
1.3 如何实现多播
实现多播需要 1.传递数据包的主机需要设置TTL(Time to Live生存时间)TTL是决定数据包传送距离的主要因素TTL用整数表示每经过一个路由器就减1直到TTL变为0时数据包就无法再传输只能销毁。因此TTL的值设置过大会影响网络流量但过小就无法传递到目标。 2.接收数据包的主机需要加入多播组。
上述两个条件的设置用套接字可选项来完成。
条件协议层可选项设置TTLIPPROTO_IPIP_MULTICAST_TTL加入多播组IPPROTO_IPIP_ADD_MEMBERSHIP
1.4 多播的代码实现
设置TTL
int time_to_live64;
setsockopt(senderfd,IPPROTO_IP,IP_MULTICAST_TTL,(void*)time_to_live,sizeof(time_to_live);
加入多播组:
ip_mreq join_adr;
join_adr.imr_multiaddrinet_addr(要加入的多播组IP地址);
join_adr.imr_interfacehtonl(加入该组的套接字所属主机的IP地址);setsockopt(recvfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)join_adr,sizeof(join_adr));
struct ip_mreq
{struct in_addr imr_multiaddr; //要加入的多播组IP地址struct in_addr imr_interface; //加入该组套接字所属主机IP
}
其中imr_interface可以用INADDR_ANY。
Sender
#includeiostream
#includecstring
#includesys/socket.h
#includeunistd.h
#includearpa/inet.hint main()
{int senderfdsocket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);if(senderfd-1){std::coutsocket fail!std::endl;}int ttl64;int ressetsockopt(senderfd,IPPROTO_IP,IP_MULTICAST_TTL,(void*)ttl,sizeof(ttl));if(res-1){std::coutsetsockopt fail!std::endl;}std::string strIp;std::cout请输入要发往的多播IP地址:;std::cinstrIp;sockaddr_in senderAddr;senderAddr.sin_familyAF_INET;senderAddr.sin_addr.s_addrinet_addr(strIp.c_str());senderAddr.sin_porthtons(9130);std::cout请输入你要发送的内容:;char buff[1024];std::cinbuff;int sendLen;sendto(senderfd,buff,sizeof(buff),0,(sockaddr*)senderAddr,sizeof(senderAddr));close(senderfd);return 0;
}
Recv
#includeiostream
#includecstring
#includesys/socket.h
#includeunistd.h
#includearpa/inet.hint main()
{int recvSocket socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);if (recvSocket -1){std::cout socket fail! std::endl;}sockaddr_in recvAddr;recvAddr.sin_family AF_INET;recvAddr.sin_addr.s_addr htonl(INADDR_ANY);recvAddr.sin_port htons(9130);if (-1 bind(recvSocket, (sockaddr*)recvAddr, sizeof(recvAddr))){std::cout bind fail! std::endl;}std::string strIp;std::cout 请输入要加入的多播IP地址:;std::cin strIp;ip_mreq join_adr;join_adr.imr_multiaddr.s_addr inet_addr(strIp.c_str());join_adr.imr_interface.s_addr htonl(INADDR_ANY);int ressetsockopt(recvSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)join_adr, sizeof(join_adr));if (res -1){std::cout setsockopt fail! std::endl;}char buff[1024];recvfrom(recvSocket, buff, sizeof(buff), 0, NULL, 0); //因为此套接字是已连接UDP套接字所以无需再进行绑定std::cout 接收到的多播信息: buff std::endl;close(recvSocket);return 0;
}运行结果
Sender Recv 注意
1.发送方和接收方的端口号要一致。
2.在这里接收方要先于发送方运行因为多播属于广播的范畴如果接收方延后则会接收不到信息。 3.Windows里设置TTL需要加上头文件#includews2tcpip.h因为IP_MULTICAST_TTL声明在这个头文件里。
2. 广播
2.1 广播与多播的区别
广播与多播的唯一区别是广播只能向同一网络中的主机传输数据而多播是可以跨越不同网络只要加入多播组就能接收到数据的。
2.2 广播的分类
广播分为直接广播、本地广播。
两者之间的差别主要是在于IP地址。 直接广播的IP地址除了网络地址外其余主机地址全部设置为1,。例如希望向网络地址为192.12.32中的所有主机传输数据则可以向192.12.32.255传输。换言之直接广播就是可以向特定区域内所有主机传输数据。 本地广播的IP地址限定为255.255.255.255。例如位于192.32.24网络中的主机向255.255.255.255传递数据时数据将传递到这个网路中的所有主机上。换言之本地广播就是只能向本地网络区域内所有主机传输数据。
2.3 实现广播
广播的实现需要
协议层套接字可选项值SOL_SOCKETSO_BROADCAST0【关闭】/1【开启】
int bcast1;
setsockopt(send_sock,SOL_SOCKET,SO_BROADCAST,(void*)bcast,sizeof(bcast));
广播的代码实现和多播没有什么区别只需要把上述代码里套接字可选项改为SO_BROADCAST即可然后在运行时输入指定的IP地址直接广播输入xxx.xxx.xxx.255本地广播输入255.255.255.255即可。