ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Network Programming : Part 2
    시스템 프로그래밍 2022. 4. 14. 14:19
    728x90

    Socket Interface : socket

    socket 함수에 관한 설명입니다.

    client와 server는 socket함수를 통해 socket descriptor을 만듭니다.

     

    Sockets Interface : bind

    server는 bind 함수를 통해 server socket은 secket descriptor을 가지고 bind하겠다는 것을 kernel에게 

    알려줍니다.

    sever 쪽 process는 sockfd를 통해 데이터를 읽을 수 있고 connection에 도착하는 모든 byte를 읽을 수 있습니다.

    마찬가지로 sockfd를 통해 쓰기를 할 수 있습니다. connection의 끝점인 addr를 이용해 데이터를 전송하게 됩니다.

     

    Sockets Interface : listen

    kernel이 socket 함수의 descriptor를 active socket이라고 부르는데 이 active socket이 listen함수를 불러

    해당 descriptor는 server에 의해 사용될 것이라고 명시하는 것입니다.

    이러한 listen함수는 sockfd를 listening socket으로 쓰겠다고 변환을 합니다. 

    따라서 이 socket으로 오는 모든 connection들은 accept이라는 함수를 통해 connection build를 하기 위한

    과정으로 넘어갑니다.

    listen함수의 마지막 argument인 backlog는 connection 요청을 받을 수 있는 최대 개수를 의미합니다.

     

    Sockets Interface : accept

    server는 client의 connection을 기다리다가 accept함수를 호출해 connection이 만들어지게 됩니다.

    server는 connection을 기다리고 있다가 listenfd로 client의 socket address(addr)와 socket address의 크기(addrlen)

    를 채워줍니다.

    그렇게 return값이 connected descriptor입니다. 그리고 connected descriptor을 가지고 client는 Unix I/O routine들을

    호출하게 됩니다.

     

    Sockets Interface : connect

    client는 server에게 connection 요청을 보냅니다.

    즉, connect함수는 server에게 지금 client가 connect를 만들거라고 요청하는것입니다.

     

    accept Illustrated

    clientfd라는 socket을 만들고 listenfd도 만들면 server는 accept함수에서 connection 요청이 오기를 기다리고 있습니다.

    connection 요청이 오는 순간 tcp manager에 있는 request queue에 들어가게 됩니다.

    accept 함수를 통해 뭔가 들어와 있으니 dequeue를 통해 connect 합니다.

    connection 요청이 온 다음 build를 하게 될때 accept함수를 통해 connfd와 clientfd를 connection합니다.

    따라서 client는 clientfd를 통해 read와 write를 하고 server는 connfd를 통해 read와 write를 합니다.

    listenfd와 connfd를 구분하는 이유는 여러 client가 server에 연결될 때 위해서입니다.

    여러 client가 connction 요청을 하면 listenfd에서는 순서대로 queueing 하고 accept함수를 호출해줘야 합니다.

    accept함수는 처음 맺은 connfd와 clientfd가 disconnect되기 전에는 accept함수를 호출하지 않습니다.

    따라서 여러 client가 요청하더라도 listenfd를 바로 처리하지는 못합니다.

     

    Connected(connfd) vs Listening Descriptors(listendfd)

    listenfd는 client connect 요청을 받기 위해 만들어진 끝점입니다. server가 종료되기 전까지는 계속 살아있습니다.

    connfd는 client와 server 사이의 끝점입니다. listen은 내가 듣고 있는 것이고 내가 accept하는 순간

    return 값이 connfd이고 그 descriptor가 생성되고 매번 cilent로 부터 온 connection 요청이 와서 accept

    할때 server에서 한 번 만들어집니다. 

    connection이 서비스를 하고 있는 동안 살아있고 connection을 끊게 되면 fd는 사라집니다.

     

    결국 listenfd와 connfd를 구분하는 이유는 concurrent server을 만들기 위해서 입니다. 많은 connect 요청이 왔을 때

    server가 일단 받기 위해서 입니다.

    이를 위해 child process fork를 통해 처리합니다.

    Sockets Helper : open_clientfd

    server와 connection하기 위해 작업합니다.

    open_clientfd 함수로 들어가면 위와 같이 셋팅합니다.

    socket함수를 이용해 socket을 받고 connetion 요청을 server에게 보냅니다.

     

    Sockets Helper : open_listenfd

    client로 부터 온 connection 요청을 accept하기 위해 listening descriptor을 만듭니다.

    open_listenfd에서는 Getaddrinfo를 만듭니다.

    socket을 만들고 bind합니다.

    이제 listen합니다. 

     

    Echo Client : Main Routine

    echo client는 open_clientfd로 connect 까지 요청을 하고 read를 하고 write한 다음 Rio_readlineb에서 

    blocking되어서 server에서 대답이 올때까지 기다립니다.

     

    Iterative Echo Server : Main Routine

    echo server에서​는 open_listenfd가 있고 while을 돌면서 accept하고 echo로 client와 정보를 주고 받게 됩니다.

    echo함수는 fd로 온 데이터를 읽고 내가 몇 byte를 읽었다는 것을 출력하고 읽은 버퍼를 write 한 다음

    그 다음 요청이 오기만을 기다립니다.

    '시스템 프로그래밍' 카테고리의 다른 글

    Synchronization : Basics  (0) 2022.04.20
    Concurrent Programming  (0) 2022.04.16
    Network Programming : Part 1  (0) 2022.04.12
    System-Level I/O  (0) 2022.04.05
    Exceptional Control Flow : Signals and Nonlocal Jumps  (0) 2022.03.29
Designed by Tistory.