#include <stdio.h>
#include <stdlib.h> #include <errno.h>
#include <string.h> #include <netdb.h>
#include <sys/types.h> #include <netinet/in.h>
#include <sys/socket.h>
#define DATALENG 1024 #define
PORT 80 /*
À¥¼ºñ½º Æ÷Æ® */ #define SERVERNUM 3 /*
¸®¾ó¼¹öÀÇ ¼ýÀÚ */ #define INTERVAL 5 /*
¸®¾ó¼¹ö °Ë»ç ÁÖ±â(ÃÊ ´ÜÀ§) */
int TcpSend(int sockfd,char *send_buf)
{
if (send(sockfd,
send_buf, strlen(send_buf), 0) == -1) {
perror("TCP send"); exit(1);
} return
1; }
int TcpRecv(int sockfd,char *recv_buf)
{ int
recv_num;
if((recv_num=recv(sockfd,recv_buf,DATALENG,0))==-1)
{ perror("TCP
recv"); exit(1);
} return
1; }
int TcpConnect(char *host,int port,char
*send_buf, char *recv_buf) { int
sockfd; struct hostent *he;
struct sockaddr_in their_addr;
if ((he=gethostbyname(host))
== NULL) { /* get the host info */ herror("gethostbyname");
exit(1);
}
if ((sockfd
= socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("TCP
socket"); exit(1);
}
their_addr.sin_family
= AF_INET; their_addr.sin_port
= htons(port); their_addr.sin_addr
= *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero),
8);
/* ¸®¾ó¼¹ö°¡ fail ‰çÀ¸¸é ´ÙÀ½ÀÇ if
¹®¿¡¼ °É·Á¼ ¸®ÅÏµÇ°Ô µÈ´Ù °íÄ¥ ÇÊ¿ä¾ø´Ù*/ if
(connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct
sockaddr)) == -1) { close(sockfd);
return
0; }
TcpSend(sockfd,send_buf);
TcpRecv(sockfd,recv_buf);
close(sockfd); return
1; }
/***** MAIN START ****/ int main()
{ char send_buf[100], recv_buf[DATALENG];
char OffCommand[SERVERNUM][100];
char OnCommand[SERVERNUM][100];
char addr[SERVERNUM][15];
int ServerOn[SERVERNUM],temp,i;
/* À¥¼¹ö¿¡°Ô ÆäÀÌÁö¸¦ ¿äûÇÏ´Â ¹®ÀåÀÌ´Ù
GET /index.html Àº ¿äûÇÏ´Â ÆäÀÌÁöÀÇÀ̸§ÀÌ´Ù. ´Ù¸¥
À̸§°ú °æ·Î·Î ¹Ù²Ù¾î Àû¾îÁ־ ¹«¹æÇÏ´Ù. User-Agent:
´Â ¿äûÇÁ·Î±×·¥À» Àû¾îÁÖ´Â ºÎºÐÀ¸·Î Àû´çÈ÷ Àû¾îÁÖ¸é
µÈ´Ù. ÇÊÀÚÀÇ °æ¿ì ÀÌ ÇÁ·Î±×·¥À» MMD ÇÁ·ÎÁ§Æ®ÀÇ
Äڵ忡¼ µû¿Â °ÍÀ̹ǷΠ¹Ì´Ï MMD ¶ó°í Àû¾ú´Ù. Host:
ºÎºÐÀº ¿äûÇÏ´Â ¸Ó½ÅÀÇ À̸§ÀÌ´Ù ÀϹÝÀûÀ¸·Î ·Îµå¹ë¼±¼ÀÇ
º°¸íÀ» ÀûÀ¸¸é µÈ´Ù*/ strcpy(send_buf,"GET /index.html
HTTP/1.0¡¬nUser-Agent: MiniMMD¡¬nHost: medusa¡¬nAccept:
*/*¡¬n¡¬n");
/* ¸®¾ó¼¹ö¿¡ ´ëÇÑ Á¤º¸¸¦ Çϳª¾¿ Àû¾îÁØ´Ù.
addr Àº ¸®¾ó¼¹öÀÇ À̸§À̸ç, OffCommand ´Â ¸®¾ó¼¹ö°¡
ÀÀ´äÀÌ ¾øÀ» ¶§ ¼öÇàÇØÁÙ ¸í·ÉÀÌ´Ù. ÀÌ ¸í·ÉÀº 210.123.54.230:80
À¸·Î µé¾î¿Â À¥¼ºñ½º ¿äûÀ» 192.168.1.1:80 ·Î Àü¼ÛÇÏÁö
¾Ê°Ô ÇØÁØ´Ù. OnCommand ´Â ¸®¾ó¼¹ö°¡ ´Ù½Ã »ì¾Æ³ª¸é
¼öÇàÇØÁÙ ¸í·ÉÀÌ´Ù.*/ /* real server 192.168.1.1
*/ strcpy(addr[0],"node1"); strcpy(OffCommand[0],"/sbin/ipvsadm
-d -t 210.123.54.230:80 -R 192.168.1.1:80");
strcpy(OnCommand[0],"/sbin/ipvsadm -a -t 210.123.54.230:80
-R 192.168.1.1:80"); ServerOn[0]=1;
/* real server 192.168.1.3 */
strcpy(addr[1],"node3"); strcpy(OffCommand[1],"/sbin/ipvsadm
-d -t 210.123.54.230:80 -R 192.168.1.3:80");
strcpy(OnCommand[1],"/sbin/ipvsadm -a -t 210.123.54.230:80
-R 192.168.1.3:80"); ServerOn[1]=1;
/* real server 192.168.1.4 */
strcpy(addr[2],"node4"); strcpy(OffCommand[2],"/sbin/ipvsadm
-d -t 210.123.54.230:80 -R 192.168.1.4:80");
strcpy(OnCommand[2],"/sbin/ipvsadm -a -t 210.123.54.230:80
-R 192.168.1.4:80"); ServerOn[2]=1;
while(1) { /*
¸ðµç ¸®¾ó¼¹ö¿¡ ´ëÇØ¼ ¿ëûÀ» º¸³»°í ÀÀ´äÀ» ¹Þ±â À§ÇÑ
½Ãµµ¸¦ ÇÑ´Ù */ for(i=0; i<SERVERNUM
; i++) { printf("%s
checking.... ",addr[i]); fflush(stdout);
/* send_buf ÀÇ ³»¿ë(À¥ÆäÀÌÁö
¿äû)À» ÁÖ¾îÁø ÁÖ¼Ò(addr[i] port) ·Î º¸³»°í ÀÀ´äÀ»
recv_buf
¿¡ ¹Þ´Â´Ù */ temp=TcpConnect(addr[i],PORT,send_buf,recv_buf);
if(temp == 0) /*
real server fail */ {
printf(" Fail¡¬n");
fflush(stdout); if(ServerOn[i]
== 1) {
ServerOn[i]=temp; /*
¸®¾ó¼¹ö°¡ Á×¾úÀ¸¸é ´õÀÌ»ó ¸®¾ó¼¹ö·Î À¥ÆäÀÌÁö ¿äûÀ»
º¸³»Áö ¾Êµµ·Ï ¸í·ÉÀ» ¼öÇàÇÑ´Ù
*/ system(OffCommand[i]);
}
} else
{ printf("
OK!!¡¬n"); fflush(stdout);
if(ServerOn[i] == 0) { ServerOn[i]=temp;
/* ¸®¾ó¼¹ö°¡ »ì¾Æ³µÀ¸¸é ¸®¾ó¼¹ö·Î À¥ÆäÀÌÁö ¿äûÀ»
´Ù½Ã º¸³»µµ·Ï ¸í·ÉÀ» ¼öÇàÇÑ´Ù */ system(OnCommand[i]);
} } }
/* Àû´çÇÑ ½Ã°£¸¶´Ù ¸®¾ó¼¹ö¸¦ üũÇÑ´Ù */ sleep(INTERVAL);
} return 0; } |