CSAPP echo 클라이언트 및 서버의 예

4932 단어 서버CSAPP
플러그인 인터페이스를 배우는 가장 좋은 방법은 예시 코드를 연구하는 것이다.다음은 echo 클라이언트의 코드를 보여 줍니다.서버와 연결을 맺은 후 클라이언트는 하나의 순환에 들어가 표준 입력에서 텍스트 줄을 읽고 서버에 텍스트 줄을 보내며 서버에서 전송된 줄을 읽고 결과를 표준 출력으로 출력합니다.fgets가 표준 입력에서 EOF를 만났을 때, 또는 사용자가 키보드에 ctrl-d를 입력했기 때문에, 또는 방향을 바꾸는 입력 파일에서 모든 텍스트 줄을 다 썼기 때문에 순환이 종료됩니다.
/* 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

클라이언트 프로세스를 새로 열면 응답이 없고 막힙니다.

좋은 웹페이지 즐겨찾기