Linux下多播编程<二>【十全十美】

简介:

     紧接着上篇博文《Linux下多播编程<一>》,我们这篇文章就一个真实的程序来说明多播编程问题。

一个多播例子的客户端

   多播组的IP地址为224.0.0.88,端口为8888,当客户端接收到多播的数据后将打印出来。客户端只有在加入多播组后才能接受多播组的数据,因此多播客户端在接收多播组的数据之前需要先加入多播组,当接收完毕后要退出多播组。

 

 
  1. /* 
  2. *broadcast_client.c - 多播的客户端 
  3. */ 
  4. #define MCAST_PORT 8888; 
  5. #define MCAST_ADDR "224.0.0.88"     /*一个局部连接多播地址,路由器不进行转发*/ 
  6. #define MCAST_INTERVAL 5                        /*发送间隔时间*/ 
  7. #define BUFF_SIZE 256                           /*接收缓冲区大小*/ 
  8. int main(int argc, char*argv[]) 
  9. {   
  10.     int s;                                      /*套接字文件描述符*/ 
  11.     struct sockaddr_in local_addr;              /*本地地址*/ 
  12.     int err = -1; 
  13.     
  14.     s = socket(AF_INET, SOCK_DGRAM, 0);     /*建立套接字*/ 
  15.     if (s == -1) 
  16.     { 
  17.         perror("socket()"); 
  18.         return -1; 
  19.     }   
  20.     
  21.                                                 /*初始化地址*/ 
  22.     memset(&local_addr, 0, sizeof(local_addr)); 
  23.     local_addr.sin_family = AF_INET; 
  24.     local_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
  25.     local_addr.sin_port = htons(MCAST_PORT); 
  26.     
  27.                                                 /*绑定socket*/ 
  28.     err = bind(s,(struct sockaddr*)&local_addr, sizeof(local_addr)) ; 
  29.     if(err < 0) 
  30.     { 
  31.         perror("bind()"); 
  32.         return -2; 
  33.     } 
  34.     
  35.                                                 /*设置回环许可*/ 
  36.     int loop = 1; 
  37.     err = setsockopt(s,IPPROTO_IP, IP_MULTICAST_LOOP,&loop, sizeof(loop)); 
  38.     if(err < 0) 
  39.     { 
  40.         perror("setsockopt():IP_MULTICAST_LOOP"); 
  41.         return -3; 
  42.     } 
  43.     
  44.     struct ip_mreq mreq;                                    /*加入广播组*/ 
  45.     mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); /*广播地址*/ 
  46.     mreq.imr_interface.s_addr = htonl(INADDR_ANY); /*网络接口为默认*/ 
  47.                                                         /*将本机加入广播组*/ 
  48.     err = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof 
  49.     (mreq)); 
  50.     if (err < 0) 
  51.     { 
  52.         perror("setsockopt():IP_ADD_MEMBERSHIP"); 
  53.         return -4; 
  54.     } 
  55.     
  56.     int times = 0; 
  57.     int addr_len = 0; 
  58.     char buff[BUFF_SIZE]; 
  59.     int n = 0; 
  60.                                         /*循环接收广播组的消息,5次后退出*/ 
  61.     for(times = 0;times<5;times++) 
  62.     { 
  63.         addr_len = sizeof(local_addr); 
  64.         memset(buff, 0, BUFF_SIZE);                 /*清空接收缓冲区*/ 
  65.                                                     /*接收数据*/ 
  66.         n = recvfrom(s, buff, BUFF_SIZE, 0,(struct sockaddr*)&local_addr, 
  67.         &addr_len); 
  68.         if( n== -1) 
  69.         { 
  70.             perror("recvfrom()"); 
  71.         } 
  72.                                                     /*打印信息*/ 
  73.         printf("Recv %dst message from server:%s\n", times, buff); 
  74.         sleep(MCAST_INTERVAL); 
  75.     } 
  76.     
  77.                                                     /*退出广播组*/ 
  78.     err = setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof 
  79.     (mreq)); 
  80.         
  81.     close(s); 
  82.     return 0; 

  一个多播例子的服务器端

    下面是一个多播服务器的例子。多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了。多播服务器的程序设计,不需要服务器加入多播组,可以直接向某个多播组发送数据。

    下面的例子持续向多播IP地址"224.0.0.88"的8888端口发送数据"BROADCAST TEST DATA",每发送一次间隔5s。

 

 
  1. /* 
  2. *broadcast_server.c - 多播服务程序 
  3. */ 
  4. #define MCAST_PORT 8888; 
  5. #define MCAST_ADDR "224.0.0.88"/    /*一个局部连接多播地址,路由器不进行转发*/ 
  6. #define MCAST_DATA "BROADCAST TEST DATA"            /*多播发送的数据* 
  7. #define MCAST_INTERVAL 5                            /*发送间隔时间*/ 
  8. int main(int argc, char*argv) 
  9.     int s; 
  10.     struct sockaddr_in mcast_addr;      
  11.     s = socket(AF_INET, SOCK_DGRAM, 0);         /*建立套接字*/ 
  12.     if (s == -1) 
  13.     { 
  14.         perror("socket()"); 
  15.         return -1; 
  16.     } 
  17.     
  18.     memset(&mcast_addr, 0, sizeof(mcast_addr));/*初始化IP多播地址为0*/ 
  19.     mcast_addr.sin_family = AF_INET;                /*设置协议族类行为AF*/ 
  20.     mcast_addr.sin_addr.s_addr = inet_addr(MCAST_ADDR);/*设置多播IP地址*/ 
  21.     mcast_addr.sin_port = htons(MCAST_PORT);        /*设置多播端口*/ 
  22.     
  23.                                                     /*向多播地址发送数据*/ 
  24.     while(1) { 
  25.         int n = sendto(s,                           /*套接字描述符*/ 
  26.                                     MCAST_DATA,     /*数据*/ 
  27.                                     sizeof(MCAST_DATA),    /*长度*/ 
  28.                                     0, 
  29.                                     (struct sockaddr*)&mcast_addr, 
  30.                                     sizeof(mcast_addr)) ; 
  31.         if( n < 0) 
  32.         { 
  33.             perror("sendto()"); 
  34.             return -2; 
  35.         }       
  36.         
  37.         sleep(MCAST_INTERVAL);                          /*等待一段时间*/ 
  38.     } 
  39.     
  40.     return 0; 

  


     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/1084520,如需转载请自行联系原作者




相关文章
|
1月前
|
算法 Linux C++
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
【Linux系统编程】解析获取和设置文件信息与权限的Linux系统调用
29 0
|
1月前
|
算法 Linux C++
【Linux系统编程】深入解析Linux中read函数的错误场景
【Linux系统编程】深入解析Linux中read函数的错误场景
205 0
|
1月前
|
Linux API C语言
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
34 0
【Linux系统编程】深入理解Linux 组ID和附属组ID的查询与设置
|
1月前
|
Linux 数据处理 C++
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(一)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
77 0
|
1月前
|
存储 Linux 测试技术
无效数据处理之道:Linux系统编程C/C++实践探索(三)
无效数据处理之道:Linux系统编程C/C++实践探索
17 0
|
1月前
|
存储 测试技术 Linux
无效数据处理之道:Linux系统编程C/C++实践探索(二)
无效数据处理之道:Linux系统编程C/C++实践探索
31 0
|
1月前
|
安全 Linux 测试技术
无效数据处理之道:Linux系统编程C/C++实践探索(一)
无效数据处理之道:Linux系统编程C/C++实践探索
70 0
|
1月前
|
存储 Linux 编译器
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
Linux C/C++ 编程 内存管理之道:探寻编程世界中的思维乐趣
50 0
|
1月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
31 1
|
1月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
32 1