欢迎 chinavb 加入本站!
 免费注册  用户登陆  汇款方式  汇款确认  产品报价  联系我们  帮助中心
加入收藏
设为首页
会员体系
申请VIP
网站首页 光盘超市 软件下载 技术文章 专题 用户中心 VIP会员 技术论坛 网站留言 娱乐中心 卓越资源
今天是:2009年01月08日 星期四  您现在位于: 首页 → 技术文章 → 剖析Linux操作系统...
   剖析Linux操作系统的网络多播IP技术
作者:knight  出处:gdlc.cublog.cn  更新时间: 2007年01月27日 
 摘要

  多播广播是用于建立分步式系统:例如网络游戏、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和1isten这两个的可执行文件,由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已经广泛应用于网络游戏、视频广播的领域。

 (本文已被浏览 935 次)
 发布人:sdccf
 → 推荐给我的好友
上篇文章:提高Linux操作系统网速的方法
下篇文章:使用partimage 备份Linux 多格式分...
 相关文章:
没有相关文章

相关搜索
查看百度中关于剖析Linux操作系统的网络多播IP技术的更多内容
查看google中关于剖析Linux操作系统的网络多播IP技术的更多内容
   文章分类
操作系统 |
SCO_UNIX  Sun_Solaris  IBM_AIX  HP_UX  Linux  BSD  Tru64_UNIX 
通用UNIX知识  Windows  Minix 
程序设计 |
Shell编程  C/C++  汇编  PHP  JAVA  Perl  Python 
ASP/HTML  XML  中间件 
数据库 |
Oracle  Informix  Sybase  Fox  DB2  SQL  MySQL 
PostgreSQL 
网络应用 |
网络应用 
计算机硬件 |
计算机主机  打印机  路由器  交换机  终端  磁带机  MO 
刻录机  终端服务器  调制解调器 
   文章评论
  → 评论内容 (点击查看)   共0条评论,每页显示5条评论   浏览所有评论
(没有相关评论)
  → 发表我的评论
您的姓名: 您的Email:
评论内容:
250字内
发表评论:      发表评论须知 →
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  • 关于我们 ┋  网站留言 ┋  网站地图 ┋  友情链接 ┋  与我在线 ┋  汇款确认 ┋  管理 ┋  TOP
    Unix爱好者家园  http://www.unix-cd.com/
    联系我们:sdccf@163.com
    腾讯QQ: 7644599
    备案序号:鲁ICP备05000455号
    Copyright (c) 2001-2008 Unix-cd.com. All Rights Reserved.