본문 바로가기
정글 2기/OS 운영체제

[OS운영체제] Network Programming_TCP/IP echo server, echo client

by Dean30 2021. 9. 26.
728x90

[OS운영체제] Network Programming_TCP/IP echo server, echo client

 

echo서버는 클라이언트가 보낸 내용을 그대로 전송해 주는 프로그램이다.

그럼 echo 서버와 echo 클라이언트를 작성하여 보자.

 

한남대학교 네트워크 랩 자료

 

echo.c 함수

//echo - read and echo text lines until client closes connection
/* $begin echo */
#include "csapp.h"

void echo(int connfd) 
{
    size_t n; 
    char buf[MAXLINE]; 
    rio_t rio;

    Rio_readinitb(&rio, connfd);
    while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) { //line:netp:echo:eof
	printf("server received %d bytes\n", (int)n);
	Rio_writen(connfd, buf, n);
    }
}
/* $end echo */

 

 

echoclient.c

 

/*
 * echoclient.c - An echo client
 */
/* $begin echoclientmain */
#include "csapp.h"

int main(int argc, char **argv) 
{
    int clientfd;
    char *host, *port, buf[MAXLINE];
    rio_t rio;

    if (argc != 3) {
	fprintf(stderr, "usage: %s <host> <port>\n", argv[0]);
	exit(0);
    }
    host = argv[1];
    port = argv[2];

    clientfd = Open_clientfd(host, port);
    Rio_readinitb(&rio, clientfd);

    while (Fgets(buf, MAXLINE, stdin) != NULL) {
	Rio_writen(clientfd, buf, strlen(buf));
	Rio_readlineb(&rio, buf, MAXLINE);
	Fputs(buf, stdout);
    }
    Close(clientfd); //line:netp:echoclient:close
    exit(0);
}
/* $end echoclientmain */

 

echoserver.c

 

/* 
 * echoserveri.c - An iterative echo server 
 */ 
/* $begin echoserverimain */
#include "csapp.h"

void echo(int connfd);

int main(int argc, char **argv) 
{
    int listenfd, connfd;
    socklen_t clientlen;
    struct sockaddr_storage clientaddr;  /* Enough space for any address */  //line:netp:echoserveri:sockaddrstorage
    char client_hostname[MAXLINE], client_port[MAXLINE];

    if (argc != 2) {
	fprintf(stderr, "usage: %s <port>\n", argv[0]);
	exit(0);
    }

    listenfd = Open_listenfd(argv[1]);
    while (1) {
	clientlen = sizeof(struct sockaddr_storage); 
	connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);
        Getnameinfo((SA *) &clientaddr, clientlen, client_hostname, MAXLINE, 
                    client_port, MAXLINE, 0);
        printf("Connected to (%s, %s)\n", client_hostname, client_port);
	echo(connfd);
	Close(connfd);
    }
    exit(0);
}
/* $end echoserverimain */

 

 

실행하기

 

터미널에서 서버 실행 파일을 실행. 포트번호를 3333으로 해준다.

 

또 다른 터미널을 켜 클라이언트 실행 파일을 실행해준다. 이때 서버와 클라이언트가 같은 컴퓨터에 있으므로 루프백(loopback) 혹은 로컬호스트(localhost) 주소인 127.0.0.1을 사용하고 서버의 포트번호 3333을 입력해준다.

 

이후 서버의 터미널에 연결되었다는 표시를 확인할 수 있다.

클라이언트에서 입력하면 서버에서는 받은 데이터의 바이트를 출력하고 다시 클라이언트에 똑같은 데이터를 전송한다.

hihi -> hihi

 

 

 

728x90

댓글