⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ha_status.c

📁 这是linux下关于C的编程
💻 C
字号:
#include "./common/common.h"
//#include "./common/sybfunc.c"
#include "./common/commonfunc.c"

struct	ha	*shm_p;
struct sockaddr_in 	tx_addr,rx_addr,tx_addrb,rx_addrb;
int    			sockrxfd, socktxfd,socktxfdb,sockrxfdb;
char			tempstr[100];
char			errtxt[1024];

struct ha* SetShm(struct ha* shm_pTMP,char *KeyPath,char KeyId)
{
	key_t	key;
	int	shmid;
	
	key	= ftok(KeyPath, KeyId);
	printf("\nKEYID:%c,key:%d\n",KeyId,key);

	shmid	= shmget(key, sizeof(struct ha), IPC_CREAT|PERMS);
	if(shmid < 0) {
		printf("\n shmid < 0\n");
		exit(1);
	}
	shm_pTMP = shmat(shmid, 0, 0);
	if(shm_pTMP < 0) {
		printf("\n shm_p < 0");
		exit(-1);
	}
	memset(shm_pTMP, 0, sizeof(struct ha));
	return(shm_pTMP);
}

void release_shm(struct ha* shm_pTMP,char *KEYPATH,char KEYID)
{
	struct 	shmid_ds	shm_desc;
	key_t			key;
	int			shmid;

	key	= ftok(KEYPATH, KEYID);
	shmid	= shmget(key, sizeof(struct ha), 0);
	if(shmid < 0) {
		perror("release_shm: shmid:");
	}
	if (shmdt(shm_pTMP) == -1){
		perror("release_shm: shmdt:");
	}	
	if (shmctl(shmid,IPC_RMID,&shm_desc) == -1){
		perror("release_shm: shmctl:");
	}
}

void house_keeper(int sig_num){
	printf("\nClearing share memory and malloced memory.\n");
	release_shm(shm_p,".",'j');
	printf("\nNow exit safely.\n");
	exit (0);
}

void catch_alarm(int sig_num)
{
	alarm(10);
	shm_p->status = 0;
	printf("\ncheck point.\n");
}

main(int argc,char **argv)
{
	unsigned char	buffer[100];
	char cluster_ip[20];
	char host_ip[20];
	char content[20];
	int pid,pid1;
	char host_flag[10];
			
	signal(SIGINT, house_keeper);
	bzero(tempstr,100);
	bzero(cluster_ip,20);
	if(argc==4){
		strcpy(tempstr,argv[1]);
		strcpy(host_ip,argv[2]);
		strcpy(host_flag,argv[3]);
		if(strlen(tempstr)==0) exit(0);
	}else if (argc!=4){
		printf("\nusage:ha_status <cluster ip addr> <another host ip> <host A/B>\n");	
		exit (0);
	}
	strcpy(cluster_ip,tempstr);
	shm_p=SetShm(shm_p,".",'j');

	pid = fork();
	if (pid==0) pid1 = fork();
	if ((pid==0)&& (pid1>0)){	
		if((sockrxfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			exit(-1);
	       	}
	        bzero(&rx_addr, sizeof(rx_addr));
		rx_addr.sin_family = AF_INET;
		rx_addr.sin_addr.s_addr = htonl(INADDR_ANY);
		rx_addr.sin_port = htons(8250);
		if(bind(sockrxfd, (struct sockaddr *)&rx_addr, sizeof(rx_addr)) < 0) {
		     	exit(-1);
		}
		bzero(buffer,100);
		
		for(;;){    
			signal(SIGALRM, catch_alarm);
			alarm(10);
			bzero(buffer, 100);
			if(recvfrom(sockrxfd, buffer, 100, 0, (struct sockaddr *)0, (int *)0) < 0){
				continue;
			}
			if(buffer[0]=='m'){
				shm_p->status = 1;
			}
			printf("\nprocess1: receiving heartbeat SIG\n");
		}
	}	
	if ((pid > 0) && (pid1 >0)){
	        bzero(content,20);
	        strcpy(content,"m");
	        socktxfd=socket(AF_INET,SOCK_DGRAM,0);
	        bzero(&tx_addr,sizeof(struct sockaddr_in));
       	 	tx_addr.sin_family=AF_INET;
	       	tx_addr.sin_port=htons(8250);
	        tx_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	       	if(inet_aton(cluster_ip,&tx_addr.sin_addr)<0){
        	        printf("Ip error. \n");
	                exit(1);
        	}
		printf("create sockt ok\n");

	        socktxfdb=socket(AF_INET,SOCK_DGRAM,0);
	        bzero(&tx_addrb,sizeof(struct sockaddr_in));
       	 	tx_addrb.sin_family=AF_INET;
	       	tx_addrb.sin_port=htons(8300);
	        tx_addrb.sin_addr.s_addr=htonl(INADDR_ANY);
	       	if(inet_aton(host_ip,&tx_addrb.sin_addr)<0){
        	        printf("Ip error. \n");
	                exit(1);
        	}
		printf("create sockt ok\n");

		for(;;){
			sendto(socktxfd,content,strlen(content),0,(struct sockaddr*)&tx_addr,sizeof(struct sockaddr_in));	
			if (shm_p->status == 1) sendto(socktxfdb,content,strlen(content),0,(struct sockaddr*)&tx_addrb,sizeof(struct sockaddr_in));	
			printf("\nprocess2: sending heartbeat SIG\n");
			sleep(1);
		}
	}		
	if ((pid==0)&&(pid1==0)){
		if((sockrxfdb = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
			exit(-1);
	       	}
	        bzero(&rx_addrb, sizeof(rx_addrb));
		rx_addrb.sin_family = AF_INET;
		rx_addrb.sin_addr.s_addr = htonl(INADDR_ANY);
		rx_addrb.sin_port = htons(8300);
		if(bind(sockrxfdb, (struct sockaddr *)&rx_addrb, sizeof(rx_addrb)) < 0) {
		     	exit(-1);
		}
		bzero(buffer,100);
		
		for(;;){    
			bzero(buffer, 100);
			if(recvfrom(sockrxfdb, buffer, 100, 0, (struct sockaddr *)0, (int *)0) < 0){
				continue;
			}
			if((buffer[0]=='m')&&(shm_p->status == 1)){
				if (host_flag[0]=='A'){
					sleep(5);
					printf("\nrelease cluster ip\n");
					system("/sbin/ifconfig eth0:1 192.168.15.111");
				}
				if (host_flag[0]=='B'){
					printf("\nrelease cluster ip\n");
					system("/sbin/ifconfig eth0:1 192.168.15.222");
				}
			}
			printf("\nprocess1: receiving heartbeat SIG\n");
		}	
	}	
}
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -