๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

TIL (Today I Learned)/Network

[TCP/IP] ํŒŒ์ผ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„

728x90

ํŒŒ์ผ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„

image

  1. ์—ฐ๊ฒฐ ์š”์ฒญ : ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์— ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์‹œ๋„ํ•ด์„œ ์—ฐ๊ฒฐํ•œ๋‹ค.
  2. ls ์š”์ฒญ : ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์— ๋ฌธ์ž์—ด ls๋ฅผ ์ „์†กํ•ด์„œ ํŒŒ์ผ ๋ชฉ๋ก์„ ์š”์ฒญํ•œ๋‹ค.
  3. ๋ฌธ์ž์—ด(ํŒŒ์ผ๋ชฉ๋ก) ์ „์†ก : ls ์š”์ฒญ์„ ๋ฐ›์€ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์€ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ฑ๋Ÿฌ์„œ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ „์†กํ•œ๋‹ค.
  4. ํ™”๋ฉด ์ถœ๋ ฅ : ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์€ ์ „์†ก๋ฐ›์€ ๋ฌธ์ž์—ด(ํŒŒ์ผ ๋ชฉ๋ก)์„ ์ž์‹ ์˜ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.

ํŒŒ์ผ ๋ชฉ๋ก ์ฝ์–ด ๋‚ด๊ธฐ

  • ํŒŒ์ผ ๋ชฉ๋ก์„ ์ฝ์–ด ๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์šด์˜์ฒด์ œ๊ฐ€ ์ฑ„ํƒํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด์„œ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฆฌ๋ˆ…์Šค๋‚˜ ์œ ๋‹‰์Šค ๊ณ„์—ด์˜ ๊ฒฝ์šฐ ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํŠน์ˆ˜ ํŒŒ์ผ๋กœ, I-๋…ธ๋“œ ๋ฒˆํ˜ธ์™€ ํŒŒ์ผ๋ช…์˜ ์Œ์„ ๊ฐ–๋Š” ๊ตฌ์กฐ์ฒด์˜ ์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ตฌ์กฐ์ฒด์—์„œ I-๋…ธ๋“œ ๋ฒˆํ˜ธ๋Š” I-๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” Index๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • I-๋…ธ๋“œ ์ •๋ณด
    • ํŒŒ์ผ ์†Œ์œ ์ฃผ์˜ ์‚ฌ์šฉ์ž ID์™€ ๊ทธ๋ฃน ID
    • ์ ‘๊ทผ ๊ถŒํ•œ ์ •๋ณด(Protection)
    • ํŒŒ์ผ ๋‚ด์šฉ์ด ์ €์žฅ๋œ ๋ฌผ๋ฆฌ์ ์ธ ๋””์Šคํฌ์˜ ๋ฒˆ์ง€
    • ํŒŒ์ผ ํฌ๊ธฐ
    • ์ตœ๊ทผ์˜ I-๋…ธ๋“œ ๋ณ€๊ฒฝ ์‹œ๊ฐ, ์ตœ๊ทผ์˜ ์ด์šฉ ์‹œ๊ฐ, ์ตœ๊ทผ์˜ ๊ฐฑ์‹  ์‹œ๊ฐ
    • ํ•ด๋‹น ํŒŒ์ผ์ด ๋ช‡ ๊ฐœ์œผ ใ…ฃ๋””๋ ‰ํ† ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š”์ง€ ์ฐธ์กฐ ์ˆ˜
    • ํŒŒ์ผ ์œ ํ˜•(๋””๋ ‰ํ† ๋ฆฌ, ์ผ๋ฐ˜ ํŒŒ์ผ, ํŠน์ˆ˜ ํŒŒ์ผ)

๊ตฌ์กฐ์ฒด

Struct dirent {
  long             d_ino;              // I-๋…ธ๋“œ ๋ฒˆํ˜ธ
  off_t            d_off;              // offset
  unsigned  short  d_reclen;           // ํŒŒ์ผ ์ด๋ฆ„ ๊ธธ์ด
  char             d_name[NAME_MAX+1]; // ํŒŒ์ผ ์ด๋ฆ„

ํ•จ์ˆ˜

#include <dirent.h>

DIR *opendir(const char *dirname);

๋ฐ˜ํ™˜ ๊ฐ’

  • ์„ฑ๊ณต : ๋””๋ ‰ํ† ๋ฆฌ ์ŠคํŠธ๋ฆผ์˜ ํฌ์ธํ„ฐ
  • ์‹คํŒจ : NULL
#include <dirent.h>

struct dirent *readdir(DIR *dirp);

๋ฐ˜ํ™˜ ๊ฐ’

  • ์„ฑ๊ณต : ํŒŒ์ผ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด dirent ๊ตฌ์กฐ์ฒด
  • ์‹คํŒจ : NULL
#include <dirent.h>

int closedir(DIR* dp);

๋ฐ˜ํ™˜ ๊ฐ’

  • ์„ฑ๊ณต : 0
  • ์‹คํŒจ : -1

ls_server.c

#include<stdio.h>
#include<string.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<dirent.h>

#define PORT 9222

char err_1[] = "Directory Error";
char rBuffer[BUFSIZ];

int main(void) {
        int c_socket, s_socket;
        struct sockaddr_in s_addr, c_addr;
        int len, length;
        int n, i;
        char *temp;

        DIR *dp;
        struct dirent *dir;

        // 1. ์†Œ์ผ“์„ ์ƒ์„ฑ
        s_socket = socket(PF_INET, SOCK_STREAM, 0);            

        /* 2. ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ฐ›์„ ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ๊ฒฐ์ •
         * ํฌํŠธ ๋ฒˆํ˜ธ 9222์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜ ์žˆ๋„๋ก
         * ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜ s_addr์— ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ๊ฒฐ์ •
         */
        memset(&s_addr, 0, sizeof(s_addr));
        s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(PORT);

        /* 3. ์†Œ์ผ“์„ ์ฃผ์†Œ์™€ ํฌํŠธ์— ์—ฐ๊ฒฐ
         * s_socket์„ ๋ณ€์ˆ˜ s_addr์— ๋”ฐ๋ผ ์—ฐ๊ฒฐ
         */
        if(bind(s_socket, (struct sockaddr *) &s_addr, sizeof(s_addr)) == -1) {
                printf("can not Bind\n");
                return -1;
        }

        /* 4. ์ปค๋„์— ๊ฐœํ†ต์„ ์š”์ฒญ
         * ์†Œ์ผ“์œผ๋กœ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์šด์˜์ฒด์ œ์— ๊ฐœํ†ต์„ ์š”์ฒญ
         */
        if(listen(s_socket, 5) == -1){
                printf("listen Fail\n");
                return -1;
        }

        // 5. ๋ฌดํ•œ๋ฐ˜๋ณต
        while(1){
                // 6. ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜์‹ 
                len = sizeof(c_addr);
                c_socket = accept(s_socket, (struct sockaddr *) &c_addr, &len);

                // 7. ํŒŒ์ผ ๋ชฉ๋ก์„ ์ถœ๋ ฅ
                length =0;
                temp = rBuffer;
                while((n = read(c_socket, temp, 1)) > 0 ){
                        if(*temp == '\r') continue;
                        if(*temp == '\n') break;
                        if(*temp == '\0') break;

                        if(length == BUFSIZ) break;
                        temp++; length++;
                }

                rBuffer[length] = '\0';

                if(!strcmp(rBuffer, "ls")) {
                        if((dp = opendir(".")) == NULL) {
                                write(c_socket, err_1, str
                        } else {
                                while((dir = readdir(dp))
                                        if(dir->d_ino == 0) continue;

                                        write(c_socket, dir->d_name, strlen(dir->d_name));
                                        write(c_socket, " ", 1);
                                }
                                closedir(dp);
                        }
                }
                // 8. ํด๋ผ์ด์–ธํŠธ์™€์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒ
                close(c_socket);
        }
        // 9. ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒ
        close(s_socket);
}

ls_client.c

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<strings.h>

#define PORT 9222
#define IPADDR "127.0.0.1"

char buffer[BUFSIZ];

int main(){
        int c_socket;
        struct sockaddr_in c_addr;
        int len;

        char rcvBuffer[BUFSIZ];

        char *temp;
        int length =0;

        int n;

        c_socket = socket(PF_INET, SOCK_STREAM, 0);

        memset(&c_addr, 0, sizeof(c_addr));
        c_addr.sin_addr.s_addr = inet_addr(IPADDR);
        c_addr.sin_family = AF_INET;
        c_addr.sin_port = htons(PORT);

        if(connect(c_socket, (struct sockaddr *) &c_addr, sizeof(c_addr)) == -1){
                printf("can't connect\n");
                close(c_socket);
                return -1;
        }

        scanf("%s", buffer);
        buffer[strlen(buffer)] = '\0';
        if((n = write(c_socket, buffer, strlen(buffer)+1)) < 0 ){
                printf("write error\n");
                exit(-1);
        }

        temp = rcvBuffer;
        while((n = read(c_socket, temp, 1)) > 0 ) {
                if(length == BUFSIZ) break;
                temp++; length++;
        }

        rcvBuffer[length] = '\0';

        printf("received Data : %s\n", rcvBuffer);

        close(c_socket);
}
  • $ ll ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ์ถœ๋ ฅ

    image

์‹คํ–‰ ํ™”๋ฉด

image