#include #include #include #include #include #include #include #define MAXLINE 1024 int readline(int,char *,int); char *escapechar = "exit\n"; int main(int argc,char *argv[]){ int i,ch; int server_fd,client_fd; int clilen,num; char sendline[MAXLINE],rbuf[MAXLINE],buff[MAXLINE]; int size,size2; pid_t pid; struct sockaddr_in client_addr,server_addr; FILE *send; if(argc<2){ perror("Usage: talk_server 3000"); exit(1); } if((server_fd=socket(PF_INET,SOCK_STREAM,0))<0){ printf("Server : Can't open stream socket\n"); exit(1); } bzero((char *) &server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(atoi(argv[1])); // ÀԷ¹ÞÀº ÆĶó¹ÌÅÍ º¯¼ö¸¦ ÀÌ¿ëÇÏ¿© Æ÷Æ® ¹øÈ£ ÁöÁ¤ if(bind(server_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))<0){ printf("Server: Can't bind local address\n"); exit(1); } printf("Server started.\nWaiting for client.."); if(listen(server_fd,1)<0){ perror("Listen error : "); exit(1); } clilen = sizeof(client_addr); if((client_fd = accept(server_fd,(struct sockaddr*)&client_addr,&clilen)) != -1){ printf("\n\n========== Server : »ç¿ëÀÚ°¡ Á¢¼ÓÇÏ¿´½À´Ï´Ù. ==========\n\n"); } else{ printf("\n\n========== Server : Á¢¼Ó¿¡ ½ÇÆÐÇÏ¿´½À´Ï´Ù. ===========\n\n"); exit(1); } if((pid=fork())>0){ while(readline(0,sendline,MAXLINE)!=0){ size=strlen(sendline); if(write(client_fd,sendline,size)!=size){ printf("Server:fail in writing\n"); } if(strncmp(sendline,escapechar,4)==0){ printf("Client disconnected\n"); kill(pid,SIGQUIT); break; } } } else if(pid==0){ while(1){ if((size=read(client_fd,rbuf,MAXLINE))>0){ rbuf[size] = '\0'; if(strncmp(rbuf,escapechar,4)==0){ kill(getppid(),SIGQUIT); break; } if(strncmp(rbuf,"**",2)==0){ send=popen(rbuf+2,"r"); if(send==NULL){ perror("Error : "); exit(1); } while(fgets(buff,MAXLINE,send) !=NULL){ printf("%s",buff); size2=strlen(buff); if(write(client_fd,buff,size2)!=size2){ printf("Server:fail in writing\n"); } } pclose(send); } printf("Client : %s",rbuf); } } } printf("========== Á¢¼ÓÀ» ²÷½À´Ï´Ù. ==========\n\n"); close(server_fd); close(client_fd); return 0; } int readline(int fd,char *ptr,int maxlen){ int n,rc; char c; for(n=1;n