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

网络

开发平台:

Unix_Linux

  1. #include "./common/common.h"
  2. //#include "./common/sybfunc.c"
  3. #include "./common/commonfunc.c"
  4. struct ha *shm_p;
  5. struct sockaddr_in  tx_addr,rx_addr,tx_addrb,rx_addrb;
  6. int     sockrxfd, socktxfd,socktxfdb,sockrxfdb;
  7. char tempstr[100];
  8. char errtxt[1024];
  9. struct ha* SetShm(struct ha* shm_pTMP,char *KeyPath,char KeyId)
  10. {
  11. key_t key;
  12. int shmid;
  13. key = ftok(KeyPath, KeyId);
  14. printf("nKEYID:%c,key:%dn",KeyId,key);
  15. shmid = shmget(key, sizeof(struct ha), IPC_CREAT|PERMS);
  16. if(shmid < 0) {
  17. printf("n shmid < 0n");
  18. exit(1);
  19. }
  20. shm_pTMP = shmat(shmid, 0, 0);
  21. if(shm_pTMP < 0) {
  22. printf("n shm_p < 0");
  23. exit(-1);
  24. }
  25. memset(shm_pTMP, 0, sizeof(struct ha));
  26. return(shm_pTMP);
  27. }
  28. void release_shm(struct ha* shm_pTMP,char *KEYPATH,char KEYID)
  29. {
  30. struct  shmid_ds shm_desc;
  31. key_t key;
  32. int shmid;
  33. key = ftok(KEYPATH, KEYID);
  34. shmid = shmget(key, sizeof(struct ha), 0);
  35. if(shmid < 0) {
  36. perror("release_shm: shmid:");
  37. }
  38. if (shmdt(shm_pTMP) == -1){
  39. perror("release_shm: shmdt:");
  40. }
  41. if (shmctl(shmid,IPC_RMID,&shm_desc) == -1){
  42. perror("release_shm: shmctl:");
  43. }
  44. }
  45. void house_keeper(int sig_num){
  46. printf("nClearing share memory and malloced memory.n");
  47. release_shm(shm_p,".",'j');
  48. printf("nNow exit safely.n");
  49. exit (0);
  50. }
  51. void catch_alarm(int sig_num)
  52. {
  53. alarm(10);
  54. shm_p->status = 0;
  55. printf("ncheck point.n");
  56. }
  57. main(int argc,char **argv)
  58. {
  59. unsigned char buffer[100];
  60. char cluster_ip[20];
  61. char host_ip[20];
  62. char content[20];
  63. int pid,pid1;
  64. char host_flag[10];
  65. signal(SIGINT, house_keeper);
  66. bzero(tempstr,100);
  67. bzero(cluster_ip,20);
  68. if(argc==4){
  69. strcpy(tempstr,argv[1]);
  70. strcpy(host_ip,argv[2]);
  71. strcpy(host_flag,argv[3]);
  72. if(strlen(tempstr)==0) exit(0);
  73. }else if (argc!=4){
  74. printf("nusage:ha_status <cluster ip addr> <another host ip> <host A/B>n");
  75. exit (0);
  76. }
  77. strcpy(cluster_ip,tempstr);
  78. shm_p=SetShm(shm_p,".",'j');
  79. pid = fork();
  80. if (pid==0) pid1 = fork();
  81. if ((pid==0)&& (pid1>0)){
  82. if((sockrxfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  83. exit(-1);
  84.         }
  85.         bzero(&rx_addr, sizeof(rx_addr));
  86. rx_addr.sin_family = AF_INET;
  87. rx_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  88. rx_addr.sin_port = htons(8250);
  89. if(bind(sockrxfd, (struct sockaddr *)&rx_addr, sizeof(rx_addr)) < 0) {
  90.       exit(-1);
  91. }
  92. bzero(buffer,100);
  93. for(;;){    
  94. signal(SIGALRM, catch_alarm);
  95. alarm(10);
  96. bzero(buffer, 100);
  97. if(recvfrom(sockrxfd, buffer, 100, 0, (struct sockaddr *)0, (int *)0) < 0){
  98. continue;
  99. }
  100. if(buffer[0]=='m'){
  101. shm_p->status = 1;
  102. }
  103. printf("nprocess1: receiving heartbeat SIGn");
  104. }
  105. }
  106. if ((pid > 0) && (pid1 >0)){
  107.         bzero(content,20);
  108.         strcpy(content,"m");
  109.         socktxfd=socket(AF_INET,SOCK_DGRAM,0);
  110.         bzero(&tx_addr,sizeof(struct sockaddr_in));
  111.           tx_addr.sin_family=AF_INET;
  112.         tx_addr.sin_port=htons(8250);
  113.         tx_addr.sin_addr.s_addr=htonl(INADDR_ANY);
  114.         if(inet_aton(cluster_ip,&tx_addr.sin_addr)<0){
  115.                  printf("Ip error. n");
  116.                 exit(1);
  117.          }
  118. printf("create sockt okn");
  119.         socktxfdb=socket(AF_INET,SOCK_DGRAM,0);
  120.         bzero(&tx_addrb,sizeof(struct sockaddr_in));
  121.           tx_addrb.sin_family=AF_INET;
  122.         tx_addrb.sin_port=htons(8300);
  123.         tx_addrb.sin_addr.s_addr=htonl(INADDR_ANY);
  124.         if(inet_aton(host_ip,&tx_addrb.sin_addr)<0){
  125.                  printf("Ip error. n");
  126.                 exit(1);
  127.          }
  128. printf("create sockt okn");
  129. for(;;){
  130. sendto(socktxfd,content,strlen(content),0,(struct sockaddr*)&tx_addr,sizeof(struct sockaddr_in));
  131. if (shm_p->status == 1) sendto(socktxfdb,content,strlen(content),0,(struct sockaddr*)&tx_addrb,sizeof(struct sockaddr_in));
  132. printf("nprocess2: sending heartbeat SIGn");
  133. sleep(1);
  134. }
  135. }
  136. if ((pid==0)&&(pid1==0)){
  137. if((sockrxfdb = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  138. exit(-1);
  139.         }
  140.         bzero(&rx_addrb, sizeof(rx_addrb));
  141. rx_addrb.sin_family = AF_INET;
  142. rx_addrb.sin_addr.s_addr = htonl(INADDR_ANY);
  143. rx_addrb.sin_port = htons(8300);
  144. if(bind(sockrxfdb, (struct sockaddr *)&rx_addrb, sizeof(rx_addrb)) < 0) {
  145.       exit(-1);
  146. }
  147. bzero(buffer,100);
  148. for(;;){    
  149. bzero(buffer, 100);
  150. if(recvfrom(sockrxfdb, buffer, 100, 0, (struct sockaddr *)0, (int *)0) < 0){
  151. continue;
  152. }
  153. if((buffer[0]=='m')&&(shm_p->status == 1)){
  154. if (host_flag[0]=='A'){
  155. sleep(5);
  156. printf("nrelease cluster ipn");
  157. system("/sbin/ifconfig eth0:1 192.168.15.111");
  158. }
  159. if (host_flag[0]=='B'){
  160. printf("nrelease cluster ipn");
  161. system("/sbin/ifconfig eth0:1 192.168.15.222");
  162. }
  163. }
  164. printf("nprocess1: receiving heartbeat SIGn");
  165. }
  166. }
  167. }