[TIL] c언어 소켓 TCP/IP accept함수의 addr 파라미터 (클라이언트 주소)

ino5·2022년 8월 21일
0

C언어 소켓 프로그래밍 공부하다 클라이언트 주소 관련 궁금한 게 생겨서 테스트해봤다.

서버쪽 코드에 보면 클라이언트 주소에 대한 sockaddr_in struct 변수가 있는데, 해당 변수는 accept 함수의 두번째 파라미터로 들어간다.

해당 변수에 클라이언트 정보가 언제 들어가는지 궁금했다. 그래서 중간중간에 printf로 변수를 찍어서 확인해 보았다.

서버쪽 코드

#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>

int main(int argc, char* argv[])
{
    int serv_sock;
    int clint_sock;

    struct sockaddr_in serv_addr;
    struct sockaddr_in clint_addr;
    socklen_t clnt_addr_size;

    /* 포트번호 입력 안하면 종료 */
    if(argc != 2)  
    {
        printf("%s <port>\n", argv[0]);
        exit(1);
    }

    /* socket */
    serv_sock = socket(PF_INET, SOCK_STREAM,0);
    if(serv_sock == -1) printf("socket error\n");
    
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(atoi(argv[1]));

    /* bind */
    if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) printf("bind error\n");

    printf("after bind: clint_addr.sin_addr: %u\n", clint_addr.sin_addr.s_addr);

    /* listen */
    if(listen(serv_sock, 5)==-1) printf("listen error\n");
    
    printf("after listen: clint_addr.sin_addr: %u\n", clint_addr.sin_addr.s_addr);

    /* accept */
    clnt_addr_size = sizeof(clint_addr);
    printf("before accept: clint_addr.sin_addr: %u\n", clint_addr.sin_addr.s_addr);
    clint_sock = accept(serv_sock, (struct sockaddr*) &clint_addr, &clnt_addr_size);
    printf("after accept: clint_addr.sin_addr: %u\n", clint_addr.sin_addr.s_addr);
    if(clint_sock == -1) printf("accept error\n");

    /* write */
    char message[] = "it is server message.";
    write(clint_sock, message, sizeof(message));
    close(serv_sock);
    close(clint_sock);
    return 0;
}

서버 코드 실행 직후

요청이 들어올 때까지 프로그램은 accept 부분에서 대기했다.

서버에 요청 들어왔을 때

accept 이후 클라이언트 주소 변수에 클라이언트 주소 값이 들어온 것을 볼 수 있다.

accept 함수가 두번째 파라미터로 들어간 클라이언트 주소 포인터 주소 값을 통해 클라이언트 주소 값을 넣은 것으로 보인다.

profile
궁금한 것을 찾아보거나 문제를 해결한 과정을 날 것의 글로 작성하였습니다.

0개의 댓글