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
'정글 2기 > OS 운영체제' 카테고리의 다른 글
[PintOS] 디버깅 도구(Debugging Tool)_printf, ASSERT, __attributes__, backtraces (0) | 2021.10.03 |
---|---|
[OS운영체제] 권영진 교수님 OS 강의 (카이스트 전산학부) (2) | 2021.10.01 |
[OS운영체제] Tiny Web Server 정리 및 Thread와 fork() (0) | 2021.09.25 |
[OS운영체제] 명시적 가용 리스트(Explicit Free List) (0) | 2021.09.16 |
[OS운영체제] 묵시적 가용 리스트(Implicit Free List) (0) | 2021.09.15 |
댓글