본문 바로가기

컴퓨터/C

C TCP/IP echo server, client 에코 서버, 클라이언트

I. server.c

  1 #include <stdio.h>
  2 #include <sys/socket.h>
  3 #include <arpa/inet.h>
  4 #include <string.h>
  5 #include <stdlib.h>
  6 #include <unistd.h>
  7
  8 #define BUF_SIZE 1024
  9
 10 void error_handling(char* message);
 11
 12 int main (int argc, char* argv[]) {
 13   int serv_sock, clnt_sock;
 14   char message[BUF_SIZE];
 15   int str_len, i;
 16
 17   struct sockaddr_in serv_adr;
 18   struct sockaddr_in clnt_adr;
 19   socklen_t clnt_adr_sz;
 20
 21   FILE* readfp;
 22   FILE* writefp;
 23
 24   if(argc!=2) {
 25     printf("Usage: %s <port>\n", argv[0]);
 26     exit(1);
 27   }
 28
 29   serv_sock=socket(PF_INET, SOCK_STREAM, 0);
 30   if(serv_sock==-1) error_handling("socket() error");
 31
 32   memset(&serv_adr, 0, sizeof(serv_adr));
 33   serv_adr.sin_family=AF_INET;
 34   serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
 35   serv_adr.sin_port=htons(atoi(argv[1]));
 36
 37   if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) error_handling("bind() error");
 38   if(listen(serv_sock, 5)==-1) error_handling("listen() error");
 39   clnt_adr_sz=sizeof(clnt_adr);
 40
 41   for(i=0; i<5; i++) {
 42     clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
 43     if(clnt_sock==-1) error_handling("accept() error");
 44     else printf("Connected client %d\n", i+1);
 45     readfp = fdopen(clnt_sock, "r");
 46     writefp = fdopen(clnt_sock, "w");
 47     while(!feof(readfp)) {
 48       fgets(message, BUF_SIZE, readfp);
 49       fputs(message, writefp);
 50       fflush(writefp);
 51     }
 52     fclose(readfp);
 53     fclose(writefp);
 54   }
 55   close(serv_sock);
 56   return 0;
 57 }
 58
 59 void error_handling(char* message) {
 60   fputs(message, stderr);
 61   fputc('\n', stderr);
 62   exit(1);
 63 }

II. client.c

  1 #include <stdio.h>
  2 #include <sys/socket.h>
  3 #include <arpa/inet.h>
  4 #include <string.h>
  5 #include <stdlib.h>
  6 #include <unistd.h>
  7
  8 #define BUF_SIZE 1024 //메시지 최대 길이. 한글 3n+1, 영문 n+1
  9
 10 void error_handling(char* message);
 11
 12 int main(int argc, char* argv[]) {
 13   int sock;
 14   char message[BUF_SIZE];
 15   int str_len;
 16   struct sockaddr_in serv_adr;
 17
 18   FILE* readfp;
 19   FILE* writefp;
 20
 21   if(argc!=3) {//실행 명령어 입력 유효성 검사
 22     printf("Usage: %s <IP> <port>\n", argv[0]);
 23     exit(1);
 24   }
 25
 26   sock=socket(PF_INET, SOCK_STREAM, 0);
 27   if(sock==-1) error_handling("socket() error");
 28
 29   //서버 주소정보 초기화
 30   memset(&serv_adr, 0, sizeof(serv_adr));
 31   serv_adr.sin_family=AF_INET;
 32   serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
 33   serv_adr.sin_port=htons(atoi(argv[2]));
 34
 35   //연결
 36   if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) error_handling("connect() error");
 37   else puts("Connected...");
 38
 39   readfp=fdopen(sock, "r");
 40   writefp=fdopen(sock, "w");
 41
 42   while(1) {
 43     fputs("Input message(Q to quit): ", stdout);
 44     fgets(message, BUF_SIZE, stdin);
 45
 46     if(!strcmp(message, "q\n") || !strcmp(message, "Q\n")) break;
 47
 48     fputs(message, writefp);
 49     fflush(writefp);
 50     fgets(message, BUF_SIZE, readfp);
 51     printf("Message from server: %s", message);
 52   }
 53   fclose(writefp);
 54   fclose(readfp);
 55   return 0;
 56 }
 57
 58 void error_handling(char* message) {
 59   fputs(message, stderr);
 60   fputc('\n', stderr);
 61   exit(1);
 62 }

III. 실행

같은 컴퓨터에서 실행한다면 IP 주소는 127.0.0.1 을 입력한다.

만약 서로 다른 컴퓨터에서 실행한다면 컴파일한 컴퓨터와 실행하는 컴퓨터가 서로 32bit / 64bit 가 동일한지 확인한다.

'컴퓨터 > C' 카테고리의 다른 글

C buffer 버퍼  (0) 2022.11.07
C HTTP Request, Response 요청, 응답 메시지  (0) 2022.11.06
C fdopen() 스트림 열기  (0) 2022.11.06
C atoi()  (0) 2022.11.06
C connect()  (0) 2022.11.05