관리 메뉴

me made it !

2024년 8월 19일 월요일 오늘의 TIL 본문

크래프톤 정글/TIL

2024년 8월 19일 월요일 오늘의 TIL

yeoney 2024. 8. 20. 00:44
반응형
10 : 00 ~ 12 : 00  네트워크 키워드 정리
13 : 00 ~ 17 : 00 코어타임 + echo() 구현
1* : 00 ~ 25 : 00  구현 함수 복습
   

 

 

1. ECHO 구현

#include "csapp.h"

int main(int argc, char **argv) // argc: 입력받은 인자의 수 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]; // 전달해준 첫 번째 인자를 host에 저장
    port = argv[2]; // 전달해준 첫 번째 인자를 port에 저장

    clientfd = Open_clientfd(host, port); // 소켓 인터페이스 핸들링을 도와주는 Open_clientfd 함수를 호출하여 서버와 연결하고, 리턴받은 소켓 식별자를 clientfd에 저장
    Rio_readinitb(&rio, clientfd);        // rio 구조체를 초기화하고, rio를 통해 파일 디스크립터 clientfd에 대한 읽기 작업을 수행할 수 있도록 설정

    while (Fgets(buf, MAXLINE, stdin) != NULL)
    {                                           // 반복하여 유저에게서 받은 입력을 buf에 저장하는데, 입력이 끊기거나 오류가 발생한다면 반복문을 종료
        Rio_writen(clientfd, buf, strlen(buf)); // 파일 디스크립터를 통해 buf에 저장된 데이터를 서버로 전송
        Rio_readlineb(&rio, buf, MAXLINE);      // rio 구조체를 통해 파일 디스크립터에서 한 줄의 문자열을 읽어와 buf에 저장, MAXLINE은 버퍼의 최대 크기
        Fputs(buf, stdout);                     // buf에 저장된 문자열을 표준 출력 stdout에 출력해줌
    }
    Close(clientfd); // 파일 디스크립터를 닫아서 클라이언트의 연결을 종료하고 사용한 리소스를 반환해줌
    exit(0);
}
#include "csapp.h"

void echo(int connfd); // 클라이언트와 통신하는 함수 echo를 선언

int main(int argc, char **argv)
{
    int listenfd, connfd;                                // 리스닝 소켓과 연결된 클라이언트 소켓의 파일 디스크립터
    socklen_t clientlen;                                 // 클라이언트의 주소 길이
    struct sockaddr_storage clientaddr;                  // 클라이언트의 주소 정보를 저장하는 구조체
    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);                                                                                 // 클라이언트와 통신하는 echo 함수 호출
        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", (int)n);
        Rio_writen(connfd, buf, n);
    }
}

 

 

2. notion 정리.

https://lying-failing-e60.notion.site/11-867075390c4b4c1d99a1af779af03e82?pvs=4

 

11장 네트워크 프로그래밍 | Notion

11.1 클라이언트 - 서버 프로그래밍 모델

lying-failing-e60.notion.site

 

 

 

정말 오랜만에 TIL을 적어본다 !! 요즘 노션에 공을 들였더니 블로그에 애정을 쏟을 시간이 하나도 없었떠랬다.

뭐랄까.   이번주 네트워크가 제일 어려운 거 같은건 나뿐일까 ? 개념 정리에도 이렇게 애를 쓰고 있는데 이 애매모호한 머릿속을 누가 말끔히 해결해줬으면 좋겠다.!

내일부터 꼭 til 도 쓰고 노션도 잘쓰고 해야겠따 . 오늘의 다짐 끝.

반응형