http://www.hackerschool.org/HS_Boards/zboard.php?id=QNA_programming&no=1089 [º¹»ç]
Á¦°¡ ¼ÒÄÏ °øºÎÇÏ¸é¼ ÀÛÀº ÇÁ·Î±×·¥ Çϳª °øºÎ¿ëÀ¸·Î Â¥º¼·Á°í Çϴµ¥ À߾ȵ˴ϴÙ..
ÀÌ·± °£´ÜÇÑ °Íµµ Àß ¾ÈµÇ´Ï.. ¾Æ °è¼Ó »ðÁú ÇÏ´Ù Àß ¾ÈµÇ¼ ¿©Â庾´Ï´Ù..
Äڵ尡 Á¶ÀâÇϽôõ¶óµµ ÀÌÇØÇØÁÖ¼¼¿ä... ¤Ð.¤Ð
ÇÁ·Î±×·¥ÀÌ µ¹¾Æ°¡´Â Çü½ÄÀº ¸ÕÀú... ¼¹ö¿Í Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇà½ÃÅ°¸é..
¼¹ö°¡ id¿Í Æнº¿öµå¸¦ ¹¯½À´Ï´Ù
Æнº¿öµå¿Í id °¡ ¸ÂÀ¸¸é ½ÇÇàÇÒ ¸í·É¾î¸¦ º¸³»ÁÝ´Ï´Ù ¼¹ö°¡,.
¸í·É¾î¶óµµ ÇغÃÀÚ.. quit, ¶û process <-- ¸Þ½ÃÁö ÀоîÁÖ°í ¸Þ½ÃÁö ÀúÀå½ÃÄÑÁÖ´ÂÇÔ¼ö
ÀÌ°Ô ÀüºÎÀÔ´Ï´Ù..
±×¸®°í Ŭ¶óÀ̾ðÆ®°¡ play process ¶ó°í ÇÏ¸é ¶Ç ¸Þ½ÃÁö¸¦ ÀԷ½Ãų²¨³Ä Ãâ·Â½Ãų²¨³Ä°í
º¸³»ÁÝ´Ï´Ù.. Ŭ¶óÀ̾ðÆ®¿¡..
ÀÌ°Ô ÀüºÎÀÔ´Ï´Ù.. ±Ùµ¥ ¼¹ö µ¹¸®°í Ŭ¶óÀ̾ðÆ®·Î ½ÇÇà½ÃÅ°¸é..
INPUT ID: <-- ¿©±â¼ ¾ÆÀ̵𸸠ÀÔ·ÂÇÏ¸é ¾ÆÀ̵𰡠¾È¸Â´Â´Ù´Â¼Ò¸®¿ÍÇÔ²² Á¾·áµÇ¾î¹ö¸³´Ï´Ù.
¹®Á¦´Â ±×°Ô ¾Æ´Ï¶ó ¼¹ö¿¡¼µµ accept ¿¡·¯ Ç¥½Ã¿ÍÇÔ°Ô Á¾·áµÇ¾î ¹ö¸³´Ï´Ù!!
Á¦»ý°¢¿¡¼ Æ÷Å©ÇÔ¼ö·Î ÇÁ·Î¼¼½º »ý¼ºÇÒ¶§ ¹¹°¡ À߸øµÈ°Í °°½À´Ï´Ù!
°í¼ö´ÔµéÀÌ Á» µµ¿ÍÁÖ¼¼¿ä ¤Ð.¤Ð
Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö ¼Ò½º ¿Ã¸³´Ï´Ù.. Çѹø ½ÇÇàÇغ¸½Ã¸é ¹«½¼¶æÀÎÁö ¾Æ½Ç²®´Ï´Ù.!!
¼¹öÀÖ´Â µð·ºÅ丮¿¡ id.txt ÆÄÀÏ»ý¼ºÇؼ °Å±â¿¡ ¾ÆÀ̵ð¾Æ¹«°Å³ª Çϳª¶û ºñ¹Ð¹øÈ£ Çϳª Àû¾îÁÖ½Ã¸é µË´Ï´Ù.. ¤Ð.¤Ð
¼¹ö ¼Ò½º :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/wait.h>
#define BUFSIZE 100
#define DEFULT_PORT 9999
void error_handling(char *); //¿¡·¯¸¦ ó¸®ÇÔ¼ö
void process(int,char *); //¼ºÀûó¸®ÇÔ¼ö
int id_check(char *,char *); //¾ÆÀ̵ðüũÇÔ¼ö
void z_handler(int sig); //Á»ºñÇÁ·Î¼¼½º¸¦Ã³¸®ÇÏ´ÂÇÔ¼ö
fd_set reads,temps; //select
int fd_max;
struct timeval timeout;
int main(int argc, char **argv)
{
struct sockaddr_in serv_addr;
struct sockaddr_in clnt_addr;
int serv_sock;
int clnt_sock;
int clnt_addr_len;
int str_len;
int port;
char recv_buf[BUFSIZE];
char send_buf[BUFSIZE];
char cmd[2][BUFSIZE];
struct sigaction act; //ÇÁ·Î¼¼½º»ý¼º°ü·Ã ÇÔ¼ö...
pid_t pid;
int state;
act.sa_handler = z_handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
state = sigaction(SIGCHLD, &act, 0);
if (state != 0){
error_handling("sig error");
}
if (argc == 2){
port = atoi(argv[1]);
}else port = DEFULT_PORT;
if( (serv_sock = socket(PF_INET, SOCK_STREAM, 0))==-1) //¼ÒÄÏ»ý¼º
error_handling("socket error");
memset(&serv_addr,0,sizeof(serv_addr)); //¾ÆÀÌÇÇÁÖ¼Ò¹× Æ÷Æ® ¼³Á¤
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(port);
if((bind(serv_sock, (struct sockaddr*)&serv_addr, /¹ÙÀεåÇÔ¼öÀû¿ë
sizeof(serv_addr))) == -1)
error_handling("bind error");
listen(serv_sock,5);
FD_ZERO(&reads); //fd_set ÀÚ·áÇüÀ» ¹Ì¸® ÃʱâȽÃÄ×½À´Ï´Ù.
while(1){
temps=reads;
if((clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr,
&clnt_addr_len)) == -1)
error_handling("accept error");
if (( pid = fork()) == -1){ //ÇÁ·Î¼¼½º»ý¼º
close(clnt_sock);
continue;
}
if (pid >0 ){ //ºÎ¸ðÇÁ·Î¼¼½º¸éŬ¶óÀ̾ðÆ®¼ÒÄÏ´Ý°í´Ù¸¥Å¬¶óÀ̾ðÆ®¹Þ¾Æµå¸±Áغñ..
close(clnt_sock);
printf("conect");
continue;
}
else{ //ÀÚ½ÄÇÁ·Î¼¼½º¸é¼¹ö¼ÒÄÏ´Ý°í ó¸®..
close(serv_sock);
FD_SET(clnt_sock, &temps); //fd_set ¼³Á¤...
timeout.tv_sec = 100;
timeout.tv_usec = 0;
int i;
str_len = sprintf(send_buf, "IN PUT ID: "); //¾ÆÀ̵𸦺¸³»¶ó°í ¿©±â¼º¸³Â½À´Ï´Ù..
send(clnt_sock, send_buf, str_len, 0);
for(i=0; i<=1; i++){ //2¹ø¸¸ ¼øȸÇÏ¿©¾ÆÀ̵ð¿ÍÆнº¿öµå¸¦cmd[0],°úcmd[1]¿¡ °¢°¢ ÀúÀåÇϴºκÐÀÔ´Ï´Ù.
//cmd´Â2Â÷¿ø¹è¿ÀÔ´Ï´Ù..
if((select(clnt_sock +1, &temps, 0, 0, &timeout)) ==-1)
error_handling("select error"); //¼¿·ºÆ®ÇÔ¼ö·ÎŬ¶óÀ̾ðÆ®°¡¾ÆÀ̵𸦺¸³¾¶§±îÁö±â´Ù¸³´Ï´Ù.
if(FD_ISSET(clnt_sock, &temps)){
str_len = recv(clnt_sock, recv_buf, sizeof(recv_buf)-1,0);
recv_buf[str_len]='\0';
sscanf(recv_buf, "%s", cmd[i]); //ù¹ø°¿¡´Â¾ÆÀ̵ð µÎ¹ø°¿¡´ÂÆнº¿öµåÀúÀåÇÕ´Ï´Ù..
}
if(i==0){ //óÀ½·çÇÁµ¹¶§¸¸ Æнº¿öµåÀÔ·ÂÇ϶ó°í º¸³Â½À´Ï´Ù..
str_len = sprintf(send_buf,"INPUT passwd: ");
send(clnt_sock, send_buf, str_len,0);
}
}
i = id_check(cmd[0],cmd[1]); //¾ÆÀ̵ð üũÇÏ´Â ÇÔ¼ö È£Ãâ..
if( i == 1 ){ //¾ÆÀ̵ð¿Í Æнº¿öµå°¡¸ÂÀ¸¸é 1À» ¹ÝȯÇϵµ·ÏÇß½À´Ï´Ù..
strcat(send_buf, "Comment:\n" //¾ÆÀ̵ð¿ÍÆнº¿öµå°¡ ¸ÂÀ¸¸é ¸í·É¾î¸¦ º¸³À´Ï´Ù.
"play process\n"
"quit\n");
str_len = strlen(send_buf);
send(clnt_sock, send_buf, str_len,0);
while(1){
if((select (clnt_sock+1, &temps,NULL,NULL, &timeout)) == -1) //clnt°¡¸í·É¾î¸¦º¸³¾¶§±îÁö±â´Ù¸³´Ï´Ù.
error_handling("select error");
if(FD_ISSET(clnt_sock, &temps))
str_len = recv(clnt_sock, recv_buf, sizeof(recv_buf)-1,0);
if(strcmp(recv_buf,"process") ==0) //play process¶ó´Â¸í·É¾î¸¦ ¹ÞÀ¸¸é ÇÔ¼ö¸¦ ½ÇÇàÇÕ´Ï´Ù..
process(clnt_sock,cmd[0]);
else {
close(clnt_sock); //quit ¸é Á¾·áÇÕ´Ï´Ù...
puts("disconnect");
exit(0);
}
}
}
else
{
sprintf(send_buf,"ID incorrect"); //¾ÆÀ̵𰡠¾È¸ÂÀ¸¸é Á¾·áÇÕ´Ï´Ù..
send(clnt_sock, send_buf, sizeof(send_buf),0);
close(clnt_sock);
exit(0);
}
}
}
return 0;
}
int id_check(char *cmd1, char *cmd2)
{
FILE *fp;
int i=0;
char buf[BUFSIZE];
fp = fopen ("id.txt", "r" ); //¿©±â¼´Â±×³É id.txt¿¡¹Ì¸® ¾ÆÀ̵ð¶ûÆнº¿öµåÀû¾î³õ°í Àоîµå¸°´ÙÀ½¿¡..
//°ªÀÌ ¸ÂÀ¸¸é 1À» ¹ÝȯÇϵµ·Ï Çß½À´Ï´Ù..
//error_handling("file open error");
while(fgets(buf, sizeof(buf), fp)){
if(strcmp(buf,cmd1)==0 && strcmp(buf,cmd2)==0)
i=1;
else
continue;
}
return i;
fclose(fp);
}
void process(int clnt_sock,char *id)
{
FILE *fp;
char recv_buf[BUFSIZE];
char send_buf[BUFSIZE];
int str_len;
char string[BUFSIZE];
fp = fopen(id,"a+");
//error_hanlding("file open error");
strcat(send_buf, "process comment:\n" //¼ºÀû󸮰ü·Ã ¸í·É¾î¸¦ º¸³À´Ï´Ù..
"process input\n"
"process output\n"
"quite\n");
send(clnt_sock, send_buf, sizeof(send_buf),0);
while(1){
temps=reads;
timeout.tv_sec = 100;
timeout.tv_usec = 0;
if(select(clnt_sock+1,&temps, 0,0,&timeout) == -1) //clnt°¡ ¸í·É¾îº¸³¾¶§±îÁö ±â´Ù·È´Ù°¡..
error_handling("select error");
if(FD_ISSET(clnt_sock, &temps)) //¸í·É¾î°¡¿À¸é ½ÇÇàÇÕ´Ï´Ù.
{
str_len = recv(clnt_sock, recv_buf,sizeof(recv_buf)-1,0);
if(strcmp(recv_buf,"process output")==0){
while(fgets(send_buf,sizeof(send_buf),fp)!=NULL){ //ÆÄÀÏÀÇÀúÀåµÈ¸ðµç³»¿ëÀ»º¸³À´Ï´Ù..!
send(clnt_sock, send_buf,sizeof(send_buf),0);
}
}else if(strcmp(recv_buf, "process input")==0){
send(clnt_sock,"message:",sizeof(10),0); //clnt°¡ º¸³½¸Þ½ÃÁö¸¦ÆÄÀÏ¿¡ÀúÀåÇÕ´Ï´Ù.
if(select(clnt_sock+1,&temps, 0, 0, &timeout) ==-1)
error_handling("select error");
if(FD_ISSET(clnt_sock, &temps))
{
while(1){
str_len = recv(clnt_sock, recv_buf,
sizeof(recv_buf)-1,0);
recv_buf[str_len]='\0';
fprintf(fp, "%s", recv_buf);
if(strcmp(recv_buf,"end")==0)
break;
}
}
}else if(strcmp(recv_buf, "quite")==0){
close(clnt_sock);
exit(0);
}
}
else continue;
}
}
//int log(int clnt_sock)
void z_handler(int sig) //Á»ºñÇÁ·Î¼¼½º ó¸®ÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù..
{
pid_t pid;
int rtn;
pid = waitpid(-1, &rtn,WNOHANG);
}
void error_handling(char *message)//¿¡·¯Ã³¸®ÇÔ¼öÀÔ´Ï´Ù..
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
Ŭ¶óÀ̾ð Æ® ¼Ò½º:
¹®Á¦°¡ ¼¹ö¿¡ ÀÖ´Â°Í °°¾Æ Ŭ¶óÀ̾ðÆ® ¼Ò½º¿¡ ÁÖ¼®À» ´ÞÁö ¾Ê¾Ñ½À´Ï´Ù..
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/time.h>
#define BUFSIZE 1000
#define DEFAULT_PORT 9999
void error_handling(char *);
int main(int argc, char **argv)
{
struct sockaddr_in serv_addr;
unsigned long dst_ip;
int port;
int serv_sock;
int str_len;
char recv_buf[BUFSIZE];
char send_buf[BUFSIZE];
struct timeval timeout;
fd_set readfd;
if(argc != 2 && argc !=3){
printf("Usage : %s <hostname><port>\n",argv[0]);
exit(1);
}
if (( dst_ip = inet_addr(argv[1]) )== INADDR_NONE){
struct hostent *he;
if((he = gethostbyname(argv[1])) == NULL ){
error_handling("gethostbyname error");
}
memcpy((char *)&dst_ip, (char *)he->h_addr, he->h_length);
}
// if(argc==3){
// if((port == atoi(argv[2]))==0){
// struct servent *se;
//;
// if((se = getservbyname(argv[2],"tcp"))!=NULL)
// port = (int)ntohs((u_short)se->s_port);
// else
// error_handling("getservbyport error");
// else
// port = DEFAULT_PORT;
// }
if((serv_sock = socket(PF_INET, SOCK_STREAM,0))==-1)
error_handling("socket erorr");
memset(&serv_addr,0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = dst_ip;
serv_addr.sin_port = htons(atoi(argv[2]));
if(connect(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)
)==-1)
error_handling("connect error");
while(1){
FD_ZERO(&readfd);
FD_SET(0,&readfd);
FD_SET(serv_sock,&readfd);
timeout.tv_sec = 100;
timeout.tv_usec = 0;
if((select(serv_sock+1, &readfd,NULL,NULL,&timeout))== -1){
error_handling("select erorr");
break;
}
if(FD_ISSET(0, &readfd)){
if(( str_len = read(0, send_buf, sizeof(send_buf)-1)) ==-1)
break;
send_buf[str_len]='\0';
if(send(serv_sock, send_buf, sizeof(send_buf),0) == -1)
break;
}
if(FD_ISSET(serv_sock, &readfd)){
if((str_len = recv(serv_sock, recv_buf, sizeof(recv_buf)-1,0))
==-1)
error_handling("recv error");
recv_buf[str_len]='\0';
printf("%s",recv_buf);
fflush(stdout);
}
}
strcpy(send_buf,"quit");
send(serv_sock,send_buf,sizeof(send_buf),0);
close(serv_sock);
return 0;
}
void error_handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
|
Hit : 2905 Date : 2006/04/30 01:01
|