ha_function.c
上传用户:bilang918
上传日期:2010-03-24
资源大小:558k
文件大小:7k
源码类别:

网络

开发平台:

Unix_Linux

  1. #include "./common/common.h"
  2. //#include "./common/sybfunc.c"
  3. #include "./common/commonfunc.c"
  4. struct sockaddr_in  tx_addr1,tx_addr2,rx_addr2,rx_addr3,tx_addra,tx_addrb;
  5. int     socktxfd1,socktxfd2,sockrxfd2,sockrxfd3,socktxfda,socktxfdb;
  6. char tempstr[100];
  7. char errtxt[1024];
  8. char cluster_ip[20],hosta_ip[20],hostb_ip[20];
  9. char host_flag[10];
  10. char mac_addr[40];
  11. char broadcast_addr[40];
  12. void release_common_ip(int sig_num){
  13. char command_str[100];
  14. printf("nreleasing common ipn");
  15. if (host_flag[0]=='A'){
  16. sprintf(command_str,"/sbin/ifconfig eth0 %s",hosta_ip);
  17. }else if (host_flag[0]=='B'){
  18. sprintf(command_str,"/sbin/ifconfig eth0 %s",hostb_ip);
  19. }
  20. system(command_str);
  21. if (host_flag[0]=='A'){
  22. strcpy(command_str,"/sbin/ifconfig eth0:1 192.168.15.111");
  23. }else if (host_flag[0]=='B'){
  24. strcpy(command_str,"/sbin/ifconfig eth0:1 192.168.15.222");
  25. }
  26. system(command_str);
  27. }
  28. void catch_alarm(int sig_num)
  29. {
  30. char command_str[100];
  31. bzero(command_str,100);
  32. sprintf(command_str,"/sbin/ifconfig eth0:1 %s",cluster_ip);
  33. printf("n%sn",command_str);
  34. system(command_str);
  35. printf("nget cluster ipn");
  36. bzero(command_str,100);
  37. sprintf(command_str,"/sbin/send_arp %s %s %s ff:ff:ff:ff:ff:ff 10",cluster_ip,mac_addr,broadcast_addr);
  38. printf("n%sn",command_str);
  39. system(command_str);
  40. if (host_flag[0]=='A') alarm(10);
  41. if (host_flag[0]=='B') alarm(20);
  42. }
  43. main(int argc,char **argv)
  44. {
  45. unsigned char buffer[100];
  46. char content[20];
  47. char SIG_REQ[10];
  48. char SIG_ANS[10];
  49. int pid1,pid2;
  50. bzero(tempstr,100);
  51. bzero(cluster_ip,20);
  52. bzero(SIG_REQ,10);
  53. bzero(SIG_ANS,10);
  54. bzero(host_flag,10);
  55. printf("n**********************************************n");
  56. printf("n*            Ha Function Block v1.1          *n");
  57. printf("n*                 2003-03-20                 *n");
  58. printf("n*              www.etonetech.com             *n");
  59. printf("n**********************************************n");
  60. printf("nha function init...n");
  61. sleep(10);
  62. if(argc==8){
  63. strcpy(tempstr,argv[2]);
  64. if(strlen(tempstr)==0) exit(0);
  65. strcpy(cluster_ip,tempstr);
  66. strcpy(host_flag,argv[1]);
  67. if (host_flag[0]=='A'){
  68. strcpy(SIG_REQ,"A");
  69. strcpy(SIG_ANS,"A");
  70. }else{
  71. strcpy(SIG_REQ,"B");
  72. strcpy(SIG_ANS,"B");
  73. }
  74. strcpy(hosta_ip,argv[3]);
  75. strcpy(hostb_ip,argv[4]);
  76. strcpy(mac_addr,argv[6]);
  77. strcpy(broadcast_addr,argv[7]);
  78. printf("nhosta_ip:%sn",hosta_ip);
  79. printf("nhostb_ip:%sn",hostb_ip);
  80. printf("nmac_addr:%sn",mac_addr);
  81. printf("nbroadcast_addr:%sn",broadcast_addr);
  82. }else if (argc!=8){
  83. printf("nusage:ha_function <A OR B> <cluster_ip_addr> <host a ip> <host b ip> <software switch on/off> <mac_addr> <network_ip>n");
  84. exit (0);
  85. }
  86. if (strcmp(argv[5],"on")==0) signal(SIGINT, release_common_ip);/*******************signal*********************/
  87. pid1 = fork(); /*******************fork()*********************/
  88. if (pid1==0) pid2 = fork();
  89. if ((pid1>0)&&(pid2>0)){
  90.         socktxfd1=socket(AF_INET,SOCK_DGRAM,0);
  91.         bzero(&tx_addr1,sizeof(struct sockaddr_in));
  92.           tx_addr1.sin_family=AF_INET;
  93.         tx_addr1.sin_port=htons(7100);
  94.         tx_addr1.sin_addr.s_addr=htonl(INADDR_ANY);
  95.         if(inet_aton(cluster_ip,&tx_addr1.sin_addr)==0){
  96.                  printf("Ip error. n");
  97.                 exit(1);
  98.          }
  99. printf("nstart sending SIG to common ip...n");
  100. /*****************发送心跳信号************************/
  101. for(;;){
  102. sendto(socktxfd1,SIG_REQ,strlen(SIG_REQ),0,(struct sockaddr*)&tx_addr1,sizeof(struct sockaddr_in));
  103. printf("nsending heartbeat SIG_REQn");
  104. sleep(1);
  105. }
  106. }
  107. if ((pid1==0)&&(pid2>0)){ /*******************接收心跳信号*************************/
  108. if((sockrxfd2 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {    /*******************<0*********************/
  109. exit(-1);
  110.         }
  111.         bzero(&rx_addr2, sizeof(rx_addr2));
  112. rx_addr2.sin_family = AF_INET;
  113. rx_addr2.sin_addr.s_addr = htonl(INADDR_ANY);
  114. rx_addr2.sin_port = htons(7100);
  115. if(bind(sockrxfd2, (struct sockaddr *)&rx_addr2, sizeof(rx_addr2)) < 0) {
  116.       exit(-1);
  117. }
  118.         socktxfda=socket(AF_INET,SOCK_DGRAM,0);
  119.         bzero(&tx_addra,sizeof(struct sockaddr_in));
  120.   tx_addra.sin_family=AF_INET;
  121.         tx_addra.sin_port=htons(7200);
  122.         tx_addra.sin_addr.s_addr=htonl(INADDR_ANY);
  123.         if(inet_aton(hosta_ip,&tx_addra.sin_addr)==0){
  124.           printf("Ip error. n");
  125.                  exit(1);
  126.          }
  127.         socktxfdb=socket(AF_INET,SOCK_DGRAM,0);
  128.         bzero(&tx_addrb,sizeof(struct sockaddr_in));
  129.   tx_addrb.sin_family=AF_INET;
  130.         tx_addrb.sin_port=htons(7300);
  131.         tx_addrb.sin_addr.s_addr=htonl(INADDR_ANY);
  132.         if(inet_aton(hostb_ip,&tx_addrb.sin_addr)==0){
  133.           printf("Ip error. n");
  134.                  exit(1);
  135.          }
  136. for(;;){    
  137. bzero(buffer, 100);
  138. if(recvfrom(sockrxfd2, buffer, 100, 0, (struct sockaddr *)0, (int *)0) < 0){
  139. printf("nreceive socket err...n");
  140. continue;
  141. }
  142. printf("nreceived SIG_REQn");
  143. if ((buffer[0]=='A')&&(host_flag[0]=='B')){
  144. printf("nHost %s recieve msg from host An",host_flag);
  145. sendto(socktxfda,SIG_ANS,strlen(SIG_ANS),0,(struct sockaddr*)&tx_addra,sizeof(struct sockaddr_in));
  146. }
  147. if ((buffer[0]=='A')&&(host_flag[0]=='A')){
  148. printf("nHost %s recieve msg from host An",host_flag);
  149. sendto(socktxfda,SIG_ANS,strlen(SIG_ANS),0,(struct sockaddr*)&tx_addra,sizeof(struct sockaddr_in));
  150. }
  151. if ((buffer[0]=='B')&&(host_flag[0]=='A')){
  152. printf("nHost %s recieve msg from host Bn",host_flag);
  153. sendto(socktxfdb,SIG_ANS,strlen(SIG_ANS),0,(struct sockaddr*)&tx_addrb,sizeof(struct sockaddr_in));
  154. }
  155. if ((buffer[0]=='B')&&(host_flag[0]=='B')){
  156. printf("nHost %s recieve msg from host Bn",host_flag);
  157. sendto(socktxfdb,SIG_ANS,strlen(SIG_ANS),0,(struct sockaddr*)&tx_addrb,sizeof(struct sockaddr_in));
  158. }
  159. printf("nsending SIG_ANSn");
  160. }
  161. }
  162. /******************告警****************************/
  163. if ((pid1==0)&&(pid2==0)){
  164. if((sockrxfd3 = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  165. exit(-1);
  166.         }
  167.         bzero(&rx_addr3, sizeof(rx_addr3));
  168. rx_addr3.sin_family = AF_INET;
  169. rx_addr3.sin_addr.s_addr = htonl(INADDR_ANY);
  170. if (host_flag[0]=='A'){
  171. rx_addr3.sin_port = htons(7200);
  172. }
  173. if (host_flag[0]=='B'){
  174. rx_addr3.sin_port = htons(7300);
  175. }
  176. if(bind(sockrxfd3, (struct sockaddr *)&rx_addr3, sizeof(rx_addr3)) < 0) {
  177.       exit(-1);
  178. }
  179. for(;;){    
  180. signal(SIGALRM, catch_alarm);
  181. if (host_flag[0]=='A') alarm(10);
  182. if (host_flag[0]=='B') alarm(20);
  183. err:
  184. bzero(buffer, 100);
  185. if(recvfrom(sockrxfd3, buffer, 100, 0, (struct sockaddr *)0, (int *)0) < 0){
  186. continue;
  187. }
  188. if ((buffer[0]!='A')&&(buffer[0]!='B')) goto err;
  189. printf("nreceiving SIG_REQn");
  190. }
  191. }
  192. }