• 이 Server는, Client로 접속했을 때 입력한 값을 그대로 돌려주는 Echo Server이다.
  • vi editor를 이용해서 아래의 source code를 입력한 후 Shift + Z + Z로 저장한다.
  • gcc를 이용하여 컴파일 한 후 Client보다 먼저 실행한다.
  • 이 때 파일명 뒤에 port number를 입력해주게 되는데, 이 port number는 Client와 같아야 한다.
  •     ex) vi echo_server.c
  •           gcc echo_server.c -o echo_server
  •           ./echo_server 50000

 

아래는 echo_server.c에 입력할 souce code이다.


 

#include<sys/wait.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define BUF_LEN 128


void clean();


int main(int argc, char* argv[]) {
     struct sockaddr_in server_addr, client_addr;
     int master_skt, slave_skt;
     int len, len_out;
    int port;
     char buf[BUF_LEN+1];

    if(argc != 3){

          printf("사용법 : %s port\n", argv[0]);

          return -1;

     }

     port = atoi(argv[2]);

     if(master_skt = socket(PF_INET, SOCK_STREAM, 0) < 0){
          printf("서버 소켓 생성 실패\n");
          return -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(port);

    if(bind(master_skt, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
          printf("서버 주소 연결 실패\n");

          return -1;
     }

     listen(master_skt, 5);
     signal(SIGCHLD, clean);

    while(1) {
          printf("Server : Waiting to accept request.\n");
          len = sizeof(client_addr);

          if(slave_skt = accept(master_skt, (struct sockaddr *)&client_addr, &len) < 0){
               printf("Fail to accept the server\n");
              return -1;
          }


          printf("Server : Client connected.\n");

          switch(fork()) {
               case 0 :
                    close(master_skt);
                    len_out = read(slave_skt, buf, sizeof(buf));
                    write(slave_skt, buf, len_out);
                    exit();

               case -1 :

                    exit();

               default :

                    close(slave_skt);
          }
     }
}

void clean(){
     union wait status;

    while(wait3(&status, WNOHANG, (struct rusage *)0) >= 0){ }
}

'공부 해 Boa요. > Network' 카테고리의 다른 글

Client  (0) 2006.10.15
Raw Socket  (0) 2006.09.29
Consol Echo Client  (0) 2006.09.27
실전 네트웍 프로그래밍 - 4 - IOCP Echo Server  (0) 2005.06.29
'실전 네트웍 프로그래밍 -3  (0) 2005.06.29

+ Recent posts