๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Group_Study/Networking

[2์ฃผ์ฐจ] Application Layer - Socket

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 9. 26.

์†Œ์ผ“์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ์˜ ํ†ต์‹ 
-> ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์„ธ์Šค - ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ 

image

โœ” OS๊ฐ€ ์ œ๊ณตํ•ด์ฃผ๋Š” API์˜ ์ผ์ข…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค
ใ€€์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฐ”๋กœ ๋ฐ‘์— ์žˆ๋Š” Transport Layer๊ฐ€ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.
ใ€€-> TCP socket or UDP socket

Socket API (TCP)

โœ” ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜๋™์ ์ด๋‹ค(ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋Œ์•„์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ)
โœ” ํด๋ผ์ด์–ธํŠธ๊ฐ€ connect ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋‘ ์†Œ์ผ“์ด ์—ฐ๊ฑธ๋œ๋‹ค. (Read - Write)

Socekt ๊ฐ„ ์—ฐ๊ฒฐ๊ณผ์ •๊ณผ ํ•จ์ˆ˜๋“ค

Function: socket

image


โœ” int type: ํ•ด๋‹น ์†Œ์ผ“์ด UDP type ์ธ์ง€ TCP type์ธ์ง€ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ์ธ์ž
โœ” ์ƒ์„ฑํ•œ ์†Œ์ผ“์˜ id / idx ๋ฐ˜ํ™˜

Function: bind

image


โœ” ์ƒ์„ฑ๋œ ์†Œ์ผ“ ์•„์ด๋””๋ฅผ ํŠน์ • ํฌํŠธ์— ๊ฒฐํ•ฉ

Function: listen

image


โœ” ์ƒ์„ฑ๋œ ์†Œ์ผ“์„ listen ์šฉ๋„๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฉฐ, ์š”์ฒญ๋“ค์„ ํ์— ๋‹ด์•„๋‘๊ณ  ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•จ (backlog)

Function: accept

image


โœ” ์ค€๋น„๊ฐ€ ๋๋‚˜์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ํ•จ
โœ” ํด๋ผ์ด์–ธํŠธ์˜ ip์ฃผ์†Œ์™€ port์ฃผ์†Œ๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค

์—ฐ๊ฒฐ ๊ณผ์ • ์ •๋ฆฌ

Function: connect

image


โœ” (ํด๋ผ์ด์–ธํŠธ๊ฐ€) ๋‹ค๋ฅธ ์†Œ์ผ“(์„œ๋ฒ„)์— ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ณด๋ƒ„

* ํด๋ผ์ด์–ธํŠธ๋Š” ์™œ bind ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊นŒ?
โœ” ํด๋ผ์ด์–ธํŠธ๋Š” ์›น ์„œ๋ฒ„์™€ ๋‹ค๋ฅด๊ฒŒ ํŠน์ • port์™€ ๊ฒฐํ•ฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ! (์•„๋ฌด๊ฑฐ๋‚˜ ์“ฐ๋ฉด ๋œ๋‹ค)

Sample code: server

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define PORT 3490 /*ํฌํŠธ ๋ฒˆํ˜ธ*/
#define BACKLOG 10 /*์ตœ๋Œ€ ์ ‘์† ๊ฐ€๋Šฅ ํ*/

main()
{
    /* ์†Œ์ผ“ ์ƒ์„ฑ (sockfd: ์†Œ์ผ“ ์•„์ด๋””(์–‘์ˆ˜), SOCK_STREAM: TCP๋ฐฉ์‹)  */

    int sockfd, new_fd; /*listen on sock_fd, new connection on new_fd */
    struct sockaddr_in my_addr; /*my address*/
    struct sockaddr_in their_addr; /*connecttor addr*/
    int sin_size;

    /*
        sockaddr_in ๊ตฌ์กฐ:
        struct sockaddr_in {
            short sin_family;
            u_short sin_port;
            struct in_addr sin_addr;
        };
        sin_family = AT_INET
        sin_port: port #(0-65535)
        sin_addr: IP-address
    */

    if((sockfd = socket(PF_INET, SOCK_STREAM, 0))==-1){
        perror("socket");
        exit(1);
    }

    /* my_addr์— ์†Œ์ผ“์˜ ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค*/
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(MYPORT); /*short, network byte order */
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    /* INADDR_ANY allows clients to connect to any one of the host's IP address*/

    if(bind(sockfd,(struct sockaddr *)&my_addr, sizeof(struct sockaddr))==-1){
        perror("bind");
        exit(1);
    }

    if(listen(sockfd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
    }
    while(1) { /*main accept() loop*/
        sin_size = sizeof(struct sockaddr_in);


        /*accept() -> ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์ด ์˜ฌ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ(block) ์ƒํƒœ */
        if((new_fd = accept(sockfd, (struct sockaddr*)&their_addr,&sin_size))==-1){
            perror("accept");
            continue;
        }

        /* ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค (์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ ์ •๋ณด ์ถœ๋ ฅ)*/
        printf("server: got connection form %s\n". inet_ntoa(their_adddr.sin_addr));
    }
}

Sample code: client

/* ์†Œ์ผ“ ์ƒ์„ฑ (SOCK_STREAM: TCP) */
if((sockfd = socket(PF_INET, SOCK_STREAM, 0))==-1){
    perror("socket");
    exit(1);
}


their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(Server_Portnumber);
their_addr.sin_addr = htonl(Servel_IP_address);

/* ์„œ๋ฒ„ ์†Œ์ผ“๊ณผ ์—ฐ๊ฒฐ(์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค) */
if(connect(sockfd,(struct sockaddr*)&their_addr, sizeof(struct sockaddr))==-1){
    perror("connect");
    exit(1);
}

Read - Write (์—ฐ๊ฒฐ ์ดํ›„)

Functions: write

image

Functions: read

image


โœ” ์—ฐ๊ฒฐ ์ดํ›„์—” ๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ(string)์„ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ณผ์ •

Close

Functions: close

image


โœ” ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ๋๋‚œ ์ดํ›„ ๋‹ค๋ฅธ ์ด์šฉ์ž๊ฐ€ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ์šฉํ•œ ์†Œ์ผ“์„ release ํ•ด์ค€๋‹ค

Socket API (UDP)

image

โœ” UDP๋Š” ํ›จ์”ฌ ๋‹จ์ˆœํ•˜๋‹ค

๋Œ“๊ธ€