CSAPP echo 클라이언트 및 서버의 예
/* echoclient.c */
#include "csapp.h"
int main(int argc, char **argv)
{
int clientfd, port;
char *host, buf[MAXLINE];
rio_t rio;
if (argc != 3) {
fprintf(stderr, "usage: %s <host> <port>
", argv[0]);
exit(0);
}
host = argv[1];
port = atoi(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);
exit(0);
}
다음은 echo 서버의 메인 프로그램을 보여 줍니다.감청 설명자를 열면 무한 순환에 들어갑니다.매번 순환할 때마다 클라이언트로부터 연결 요청을 기다리고 연결된 클라이언트의 도메인 이름과 IP 주소를 출력하며 echo 함수를 호출합니다.echo 프로그램이 돌아온 후, 메인 프로그램은 연결된 설명자를 닫습니다.클라이언트와 서버가 각자의 설명자를 닫으면 연결도 종료됩니다.
간단한 echo 서버는 한 번에 클라이언트만 처리할 수 있습니다.이런 유형의 서버는 클라이언트 간에 한 번씩 교체되며, 이를 교체 서버 (iterative server) 라고 부른다.
/* echoserveri.c */
#include "csapp.c"
void echo(int connfd);
int main(int argc, char **argv)
{
int listenfd, connfd, port, clientlen;
struct sockaddr_in clientaddr;
struct hostent *hp;
char *haddrp;
if (argc != 2) {
fprintf(stderr, "usage: %s <port>
", argv[0]);
exit(0);
}
port = atoi(argv[1]);
listenfd = Open_listenfd(port);
while (1) {
clientlen = sizeof(clientaddr);
connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen);
hp = Gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr,
sizeof(clientaddr.sin_addr.s_addr), AF_INET);
haddrp = inet_ntoa(clientaddr.sin_addr);
printf("server connected to %S (%s)
", hp->h_name, haddrp);
echo(connfd);
Close(connfd);
}
exit(0);
}
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) {
printf("server received %d bytes
", n);
Rio_writen(connfd, buf, n);
}
}
실행 및 결과 검증
먼저 서비스 프로그램을 시작합니다.
$ ./echoserver 1024
그런 다음 클라이언트 프로그램을 엽니다.
$ ./echoclient localhost 1024
클라이언트가 Hello 후 서버의 출력을 입력하려면:
server connected to server received 6 bytes
클라이언트 프로세스를 새로 열면 응답이 없고 막힙니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
집 서버 설계 (하드웨어 편)자신의 Redmine이나 ownCloud를 운용하기 위해 사쿠라 VPS, DigitalOcean, OpenShift 등을 놀랐습니다만, 침착 해 왔으므로 현상을 정리하고 싶습니다. 먼저 하드웨어 구성을 정리합니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.