首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | linux相关 | linux认证 | 下载中心 | 专题
oklinux
 系统管理:中文环境 系统管理 桌面应用 内核技术 Linux基础:安装配置 常用命令 经验技巧 软件应用 Linux数据库:Mysql POSTGRE
 网络管理:网络安全 网络应用 Linux服务器 编程开发:PHP CC++ Python Perl SHELL 嵌入式开发 | PHP基础 PHP技巧 PHP应用 PHP文摘
 首页 linux资讯动态 Linux专题 | 其他Unix Linux解决方案 硬件相关 Linux认证 企业应用 Apache | 相关下载:资料 参考手册 开发工具
 → 当前位置:首页>网络管理>网络应用>正文

Linux 网络的多播 IP 技术

OKLinux www.oklinux.cn 2005-06-10 来源:oklinux收集整理 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 <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h>#include <unistd.h> #include <stdlib.h>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 <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdlib.h> #include <unistd.h> 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 已经广泛应用于网络游戏、视频广播的领域。
上一篇:怎样在LINUX上实现单臂路由器的功能   下一篇:GDLC邮件服务器方案
收藏于收藏夹】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·GDLC邮件服务器方案
·怎样在LINUX上实现单臂路由器的功能
·黑客攻击你的N个理由(linux版)
·全国主要城市的DNS服务器列表
·检测你一下你DNS方面的知识
·在防火墙环境下DNS的安装与设置
·架设dns全攻略
·小型网络中的DNS设置
·Linux网络安全之经验谈
·apache+php+jsp+mysql+phpmyadmin全攻略
发表评论
密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。)
站内搜索
阅读排行榜
·linux相关网址精选
·Vyatta开源软件软件使用评
·linux上的 heartbeat 双机
·Linux下如何查看某一进程
·用Xmanager远程管理LINUX
·Linux系统中动态链接库的
·Linux系统开启Telnet服务
·UNIX设置MySql数据同步 实
·Linux环境下如何去远程登
·Linux操作系统下配置无密
最新文章
·红旗4.1的使用手册
·linux下的FTP
·红旗LINUX下路由的实现
·红旗4.1下架设菁菁全站V1
·防Linux病毒之道
·谈谈针对Linux的病毒起源
·用Linux防火墙伪装抵住黑
·Qmail知识库专栏导读
·apache+php+jsp+mysql+php
·黑客攻击你的N个理由(lin
·GDLC邮件服务器方案
·怎样在LINUX上实现单臂路
·全国主要城市的DNS服务器
·检测你一下你DNS方面的知
·在防火墙环境下DNS的安装

设为首页 - 加入收藏 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2007 All rights reserved OKLinux.Cn 版权所有
合作联系 QQ:18743986 Email:arlan8005#163.com