黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图
您现在的位置: 黑客风云 >> 黑客文章 >> 网管频道 >> 疑难技巧 >> 文章正文
[推荐]剖析Linux操作系统的网络多播IP技术
        ★★★
剖析Linux操作系统的网络多播IP技术
文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-10-31

  二、使用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);}

 

上一页  [1] [2] [3] 下一页  

文章录入:sygbox    责任编辑:sygbox 
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886