热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux网络的多播IP技术

Linux网络的多播IP技术--Linux企业应用-Linux服务器应用信息,下面是详情阅读。
作者:曹江华

多播广播是用于建立分步式系统:例如网络游戏、ICQ 聊天构建、远程视频会议系统的重要工具。使用多播广播的程序和 UDP 向单个介绍方发送信息的程序相似。区别在于多播广播程序使用特殊的多播 IP 地址。

目录

一、配置 Linux 支持多播 IP
二、使用 Linux 多播 IP 广播数据

例如本地计算机的的IP地址是:127.0.0.1 二它的多播地址是: 224.0.0.1。这是由 RCF 1390 定义的。为发送 IP 多播数据,发送者需要确定一个合适的多播地址,这个地址代表一个组。IPv4 多播地址采用 D 类 IP 地址确定多播的组。在 Internet 中,多播地址范围是从 224.0.0.0 到 234.255.255.255。其中比较重要的地址有:

  224.0.0.1 - 网段中所有支持多播的主机

  224.0.0.2 - 网段中所有支持多播的路由器

  224.0.0.4 - 网段中所有的 DVMRP 路由器

  224.0.0.5 - 所有的 OSPF 路由器

  224.0.0.6 - 所有的 OSPF 指派路由器

  224.0.0.9 - 所有 RIPv2 路由器

IPv6 地址空间中有 1/256 的地址空间分配给多播地址。一个FF(11111111)值标识该地址是多播地址。标识段高三位始终设置为 0 并保留。第四位T标识设置为 0 时表示一个永久分配的多播地址。T 标识设置为 1 时,表示非永久分配的多播地址,这种地址作为一个临时的多播地址。

一、配置 Linux 支持多播 IP

在默认状态下,大多 Linux 发行版本关闭的对多播 IP 的支持。为了在 Linux 系统使用多播套接口,需要从新配置和编译 Linux 内核。下面看一下配置步骤:

1.cd /usr/src/linux

2.make menuconfig

3.选择网络选项

4.选中 IP:Enable Multicasting IP 一项

5.保存并从 menuconfig 退出

6.运行:make dep;make clean;make bzlmage

7.cp/vmlinuz/vdimLz_good

8.cparch/i386/boot/zImage/vmlinzz

9.cd/etc

10.编辑 lilo.conf,加入针对 /vmlinuz_good 的内核新选项

11.运行 li1o

Linux 内核编译后,以超级用户身份运行命令:

#router add ?net 224.0.0.0 netmask 224.0.0.0 dev lo

核实命令是否加入系统,运行命令:

#route ?eKernel IP routing table
Destination gatewary Genmask Flags MSS Window irtt Iface
10.0.0.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
BASE_ADDRESS>MC * 240.0.0.0 U 0 0 0 lo
Default 10.0.0.1 0.0.0.0 UG 0 0 0 eth0

其中出现多播地址: 224.0.0.1。就表示配置成功了。

二、使用 Linux 多播 IP广播数据

1、首先在服务器端建立多播程序:

服务器端程序代码和解释:

/* * broadcast.c - An IP multicast server */ #include #include #include #include #include #include #include int port = 6789; int main(void) { int socket_descriptor; struct sockaddr_in address; /* 首先建立套接口 */ socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0); if (socket_descriptor == -1) { perror("Opening socket"); exit(EXIT_FAILURE); } /* 初始化IP多播地址 */ memset(&address, 0, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("224.0.0.1"); address.sin_port = htons(port); /* 开始进行IP多播 */ while(1) { if(sendto(socket_descriptor, "test from broadcast", sizeof("test from broadcast"), 0, (struct sockaddr *)&address, sizeof(address)) <0) { perror("sendto"); exit(EXIT_FAILURE); } sleep(2); } exit(EXIT_SUCCESS);}

2、创建 Linux 客户端的程序多播 IP 广播

建立号广播服务器后,就需要一个客户端的收听程序,收听多播 IP 广播要求在程序中作以下几项工作:

(1)、多播方收听,客户端编写通知 Linux 内核每个指定的套接口加入多播 IP 广播组。

(2)、收听方必须运行在同一个 Linux 计算机的不同进程的同一个套接口。

(3)、编写配置丹江口设定广播信息可以发送给同一个 Linux 主机,这样作的用处是在同一个 Linux 主机上测试广播程序和收听程序,易于调试。

客户端程序代码和解释

/* * listen.c - An IP multicast client */ #include #include #include #include #include #include #include char * host_name = "224.0.0.1"; /* 多播IP地址 */ int port = 6789; int main(void) { struct ip_mreq command; int loop = 1; /* 多播循环 */ int iter = 0; int sin_len; char message[256]; int socket_descriptor; struct sockaddr_in sin; struct hostent *server_host_name; if((server_host_name = gethostbyname(host_name)) == 0) { perror("gethostbyname"); exit(EXIT_FAILURE); } /*bzero(&sin, sizeof(sin));*/ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(port); if((socket_descriptor = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } /* 调用bind之前,设置套接口选项启用多播IP支持*/ loop = 1; if(setsockopt(socket_descriptor, SOL_SOCKET, SO_REUSEADDR, &loop, sizeof(loop)) <0) { perror("setsockopt:SO_REUSEADDR"); exit(EXIT_FAILURE); } if(bind(socket_descriptor, (struct sockaddr *)&sin, sizeof(sin)) <0) { perror("bind"); exit(EXIT_FAILURE); } /* 在同一个主机上进行广播设置套接口, 作用是方便单个开发系统上测试多播IP广播 */ loop = 1; if(setsockopt(socket_descriptor, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) <0) { perror("setsockopt:IP_MULTICAST_LOOP"); exit(EXIT_FAILURE); } /* 加入一个广播组。进一步告诉Linux内核, 特定的套接口即将接受广播数据*/ command.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); command.imr_interface.s_addr = htonl(INADDR_ANY); if(command.imr_multiaddr.s_addr == -1) { perror("224.0.0.1 not a legal multicast address"); exit(EXIT_FAILURE); } if (setsockopt(socket_descriptor, IPPROTO_IP, IP_ADD_MEMBERSHIP, &command, sizeof(command)) <0) { perror("setsockopt:IP_ADD_MEMBERSHIP"); } while(iter++ <8) { sin_len = sizeof(sin); if(recvfrom(socket_descriptor, message, 256, 0, (struct sockaddr *)&sin, &sin_len) == -1) { perror("recvfrom"); } printf("Response #%-2d from server: %s\n", iter, message); sleep(2); } /* 接受8个广播后退出 */ if(setsockopt(socket_descriptor, IPPROTO_IP, IP_DROP_MEMBERSHIP, &command, sizeof(command)) <0) { perror("setsockopt:IP_DROP_MEMBERSHIP"); } close(socket_descriptor); exit(EXIT_SUCCESS);}

3、运行 Linux 多播 IP 程序

运行程序,打开两个终端窗口并在每个窗口中输入以上的源代码。在一个窗口中键入 make,编译 broadcast 和 listen 这两个的可执行文件,由 GUN make 建立一个 Makfiles 文件。GUN make 是 Linux 系统中一个自动生成和维护目标程序的工具。

在一个窗口中通过执行 ./broadcast,在另一个的窗口执行 ./listen,启动收听程序,你应该看到如下输出:


#./listenResponse #1 form sever :test from broadcast Response #2 form sever :test from broadcast Response #3 form sever :test from broadcast Response #4 form sever :test from broadcast Response #5 form sever :test from broadcast Response #6 form sever :test from broadcast Response #7 form sever :test from broadcast Response #8 form sever :test from broadcast #

4、总结

Linux 多播 IP 是一种同时向价格进程高效的发送信息的介绍。多播传输中,数据被发送到接收者的多播地址,而不是每个接收者的单播地址,发送者只发送一个数据拷贝,源端到目标端路径上的中间节点复制该数据。现在多播 IP 已经广泛应用于网络游戏、视频广播的领域。
推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在CentOS 7.x上进行端口映射配置的方法,通过修改内核和配置防火墙实现端口映射。作者分享了自己使用华为服务器进行端口映射的经验,发现网速比直连还快且稳定。详细的配置过程包括开启系统路由模式功能、设置IP地址伪装、设置端口映射等。同时,还介绍了如何监听本地端口的tcp请求,以及删除规则和开放的端口的方法。 ... [详细]
author-avatar
手机用户2502928693
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有