设为首页
联系我们
加入收藏
| 网络工具 | 系统工具 | 应用软件 | 多媒体类 | 联络聊天 | 行业软件 | 图形图像 | 安全相关 | 编程开发 | 教育教学 | 游戏娱乐 |
| 程序源码 | ASP 源码 | CGI 源码 | PHP 源码 | 驱动下载 | 字体下载 | 素材下载 | 桌面大全 | 闪客天地 | 外挂插件 | 考题下载 |

站内搜索:

您的位置:首页-> 资讯中心-> 操作系统-> Linux-> Linux网络的多播IP技术

Linux

Windows 9.x
Windows Me
Windows 2000
Windows XP
Windows 2003
Linux
Windows Longhorn
注 册 表

本类阅读TOP10

·为Linux安装红旗紫光输入法
·Linux下如何安装设置网卡
·linux下设置基本网络参数四法
·找回Redhat Linux 7.2的超级用户密码
·初学Linux上手技巧
·将Linux配置为代理防火墙用途
·如何在Linux下使用ADSL上网
·在Windows下访问Linux
·关注安全:加固Linux服务器
·Linux网络的多播IP技术

精品推荐

Linux网络的多播IP技术

作者:未知 来源:未知 加入时间:2004-12-1

多播广播是用于建立分步式系统:例如网络游戏、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 Cnet 224.0.0.0 netmask 224.0.0.0 dev lo 

  核实命令是否加入系统,运行命令: #route CeKernel 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);} 

 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已经广泛应用于网络  

(出处:颠峰软件天下)





相关文章
相关软件