当前位置:首页 > CN2资讯 > 正文内容

多服务器 KVM 多服务器广播功能

21小时前CN2资讯


UDP广播与多播

测试者: Space Sun

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)、多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

UDP广播

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。

其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

UDP多播

同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0到239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。下面将给出一个简单的多播接受数据的例子:

// 发送端 #include #include #include #include #include #include #include #include #include usingnamespacestd; intmain() { setvbuf(stdout, NULL, _IONBF, 0); fflush(stdout); intsock = -1; if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { cout< returnfalse; } constintopt = 1; //设置该套接字为广播类型, intnb = 0; nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&opt,sizeof(opt)); if(nb == -1) { cout< returnfalse; } structsockaddr_in addrto; bzero(&addrto,sizeof(structsockaddr_in)); addrto.sin_family=AF_INET; addrto.sin_addr.s_addr=htonl(INADDR_BROADCAST); addrto.sin_port=htons(6000); intnlen=sizeof(addrto); while(1) { sleep(1); //从广播地址发送消息 charsmsg[] = {"abcdef"}; intret=sendto(sock, smsg, strlen(smsg), 0, (sockaddr*)&addrto, nlen); if(ret<0) { cout< } else { printf("ok "); } } return0; } // 接收端 #include #include #include #include #include #include #include #include #include usingnamespacestd; intmain() { setvbuf(stdout, NULL, _IONBF, 0); fflush(stdout); // 绑定地址 structsockaddr_in addrto; bzero(&addrto,sizeof(structsockaddr_in)); addrto.sin_family = AF_INET; addrto.sin_addr.s_addr = htonl(INADDR_ANY); addrto.sin_port = htons(6000); // 广播地址 structsockaddr_in from; bzero(&from,sizeof(structsockaddr_in)); from.sin_family = AF_INET; from.sin_addr.s_addr = htonl(INADDR_ANY); from.sin_port = htons(6000); intsock = -1; if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { cout< returnfalse; } constintopt = 1; //设置该套接字为广播类型, intnb = 0; nb = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&opt,sizeof(opt)); if(nb == -1) { cout< returnfalse; } if(bind(sock,(structsockaddr *)&(addrto),sizeof(structsockaddr_in)) == -1) { cout< returnfalse; } intlen =sizeof(sockaddr_in); charsmsg[100] = {0}; while(1) { //从广播地址接受消息 intret=recvfrom(sock, smsg, 100, 0, (structsockaddr*)&from,(socklen_t*)&len); if(ret<=0) { cout< } else { printf("%s\t", smsg); } sleep(1); } return0; }

自已在Linux虚拟机下测试可以成功, 前提是要把主机设置在同一网段内,

还有就是不要忘记关闭Linux的防火墙.. 可以使用setup命令进行设置。

(我在测试的时候只能发送不收接收,折磨了我半天,后来才想到是Linux防火墙的问题。。)

UDP组播

实现服务器对客户端分组播放(发送数据)。

实现步骤:

server.c

1、创建服务器套接字

#include #include int socket(int domain, int type, int protocol); 返回套接字

2、构建服务器地址结构

struct sockaddr_in serveraddr; #include bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); //IP serveraddr.sin_port = htons(SERVER_PORT);//端口

3、绑定地址

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

4、构建组播属性结构

struct ip_mreqn group; #include inet_pton(AF_INET,GROUP,&group.imr_multiaddr);//设置组播地址 net_pton(AF_INET,"0.0.0.0",&group.imr_address);//设置本地地址 group.imr_ifindex=if_nametoindex("ent0");//设置网卡接口

5、设置组播权限和属性

setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,&group, sizeof(group));//设置组播权限及选项

6、设置客户端组播地址

struct sockaddr_in cliaddr; bzero(&cliaddr,sizeof(cliaddr)); cliaddr.sin_family=AF_INET; inet_pton(AF_INET,GROUP,&cliaddr.sin_addr.s_addr); cliaddr.sin_port=htons(CLIENT_PORT);

7、发送数据

sendto(sockfd,buf,strlen(buf),0,(structsockaddr*)&cliaddr, sizeof(cliaddr));//往组播地址发送信息,返回数据大小

client.c

1、创建客户端套接字

2、构建客户端地址结构

3、绑定地址

4、构建组播结构

5、设置组播权限和属性

6、接收数据

#include #include len=recvfrom(confd,buf,sizeof(buf),0,NULL,0);//接收数据

关于虚拟机的网卡配置,建议选择桥接模式。NAT的模式的话,是受限制的,可能会收不到广播消息。

具体的参考网上的文章吧。。

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/32049.html

    分享给朋友:

    “多服务器 KVM 多服务器广播功能” 的相关文章

    如何使用DigitalOcean优惠码获取200美元免费额度

    DigitalOcean是一家备受赞誉的云计算服务提供商,专门致力于为开发者和初创公司提供一流的云基础设施解决方案。通过其简单易用的界面和高效的性能,DigitalOcean帮助用户轻松地部署和扩展应用程序。我在使用DigitalOcean时,深刻感受到了它为开发者量身定制的便捷性,毫无疑问,这使得...

    解决VPS无法访问Docker的常见问题与有效方法

    VPS无法访问Docker的原因分析 使用VPS运行Docker的过程是许多开发者和运维人员日常工作的重要组成部分。遇到VPS无法访问Docker的情况,首先需要明确问题的原因。这个问题可能来源于多个方面,包括网络配置、Firewall与安全组的设定,还可能涉及到Docker本身的配置和地域限制。...

    选择阿里云VPS的最佳理由与性能评测

    在开始之前,先谈谈VPS是什么。VPS是虚拟专用服务器(Virtual Private Server)的缩写,简单来说,就是把一台物理服务器划分成多个虚拟服务器。每个VPS都拥有独立的操作系统和资源。这种安排让我能够更灵活地管理自己的服务器。一方面,VPS提供了更高的控制权和自定义性,另一方面,它比...

    云服务器购买指南:选择适合你的云服务方案

    在我开始谈论云服务器购买指南时,首先让我给你解释一下“云服务器”是什么。简单来说,云服务器是基于云计算技术构建的虚拟服务器。它通过网络将计算、存储和其他资源结合在一起,提供灵活的计算能力。相比传统的物理服务器,云服务器的优势在于其高度的可扩展性、经济性和便捷性。你可以根据具体需求随时增减资源,而且没...

    提升游戏体验的利器:steamsv工具使用指南

    1.1 steamsv简介 我最近发现了一个非常实用的工具,叫做steamsv。它的主要功能是帮助用户在Steam平台上实现各种定制和优化,特别适合那些热爱游戏的朋友。对我而言,steamsv不仅简单易用,还能提供额外的便利,让我的游戏体验更加顺畅。 steamsv特别适合那些希望改善下载速度、减少...

    优质原生IP在美国市场的重要性及选择指南

    在当今数字化环境中,优质原生IP的概念如果不被清晰理解,将很可能错失其中的机会。首先,什么是原生IP?简单来说,原生IP指的是独特且天然的互联网协议地址,这些地址不是通过代理或虚拟私人网络(VPN)等技术生成的,而是真实的独立IP地址。拥有一个原生IP可以提高网络连接的稳定性和安全性,因为它减少了被...