Toby's Study Blog
article thumbnail

๐Ÿ“ ์†Œ์ผ“ ํ†ต์‹ ์ด๋ž€?

์šฐ์„  ์†Œ์ผ“์€ ๋‘ ๊ฐœ์˜ ์ปดํ“จํ„ฐ(์—”๋“œํฌ์ธํŠธ)๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ†ต๋กœ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๋‘ ๊ฐœ์˜ ์ปดํ“จํ„ฐ๋Š” ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค.
์œ„ ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ†ต์‹ ์„ ํ•˜๋Š” ๊ฒƒ์„ ์†Œ์ผ“ ํ†ต์‹ ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
์†Œ์ผ“ ํ†ต์‹ ์€ ์—ฐ๊ฒฐ ์ง€ํ–ฅํ˜• ํ†ต์‹ ์ธ TCP์™€ ๋น„์—ฐ๊ฒฐ ์ง€ํ–ฅ ํ†ต์‹ ์ธ UDP๊ฐ€ ์žˆ๋‹ค.

๐Ÿ“ ์†Œ์ผ“ ํ†ต์‹  ๊ณผ์ •

์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๊ธ€์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด ํ†ต์‹  ๊ณผ์ •์€ ๋‹ค์Œ์™€ ๊ฐ™๋‹ค.


์„œ๋ฒ„ ์ธก (Google ์„œ๋ฒ„ PC)

  1. socket() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์†Œ์ผ“์„ ์ƒ์„ฑ
  2. bind() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์†Œ์ผ“์— IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ 
  3. listen() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
  4. accept() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ , ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์˜ ์†Œ์ผ“๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š”
    ์ƒˆ๋กœ์šด ์†Œ์ผ“์„ ์ƒ์„ฑ 

ํด๋ผ์ด์–ธํŠธ ์ธก (์›น ๋ธŒ๋ผ์šฐ์ € - ํฌ๋กฌ)

  1. socket() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์†Œ์ผ“์„ ์ƒ์„ฑ
    (โ€ป ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ์— ์—ฌ๋Ÿฌ ์†Œ์ผ“์ด ์กด์žฌํ•  ๋•Œ ๊ตฌ๋ถ„์ง“๊ธฐ ์œ„ํ•ด ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ์ƒ์„ฑํ•˜๊ณ 
         ์„œ๋ฒ„ ์†Œ์ผ“ ์—์„œ๋Š” ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ™•์ธ ํ›„ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐ”์ธ๋”ฉ ํ•จ)
  2. connect() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ์†Œ์ผ“์— ์—ฐ๊ฒฐ์„ ์‹œ๋„
  3. send() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ(์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด)๋ฅผ ์ „์†ก
  4. recv() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ(๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ)๋ฅผ ์ˆ˜์‹ 
  5. close ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ†ต์‹ ์ด ๋๋‚˜๋ฉด ์†Œ์ผ“์„ ๋‹ซ์Œ

์†Œ์ผ“ ํ†ต์‹ ์˜ ๊ตฌ์ฒด์ ์ธ ๋„คํŠธ์›Œํฌ ๋‚ด์šฉ(e.g. TCP, UDP)์€ ์•„๋ž˜ ๋งํฌ์— ๋”ฐ๋กœ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.  

 https://toby12.tistory.com/4  

 

๋„คํŠธ์›Œํฌ

๋„คํŠธ์›Œํฌ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋…ธ๋“œ๊ฐ€ ๋งํฌ๋ฅผ ํ†ตํ•ด ์œ ์„  ๋˜๋Š” ๋ฌด์„ ์œผ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ๋ฆฌ์†Œ์Šค(๋ฐ์ดํ„ฐ)๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ โ€ป ๋…ธ๋“œ : PC, ํ”„๋ฆฐํ„ฐ, ์Šค์บ๋„ˆ, ์„œ๋ฒ„ ๋“ฑ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฐ์ข… ์žฅ๋น„

toby12.tistory.com

 

๐Ÿ“ ์‹ค์Šต ๋ชฉํ‘œ

  1. ์†Œ์ผ“ ํ†ต์‹ ์„ ์ด์šฉํ•œ ํŒŒ์ผ ์ „์†ก ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ
    • ์„œ๋ฒ„ 
      ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™์‹œํ‚ฌ ๋•Œ ์ƒ์„ฑ ๋˜๋Š” ์—ด๊ฑฐํ•œ ํŒŒ์ผ์— ์ €์žฅํ•จ
    • ํด๋ผ์ด์–ธํŠธ 
      ์„ ํƒํ•œ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์„œ๋ฒ„์— ์ „์†ก
  2. make ํŒŒ์ผ๋กœ ๋นŒ๋“œ
  3. server, client ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰   
  4. ์„œ๋ฒ„์— ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ๋จ ํ™•์ธ

๐Ÿ“ ์‹ค์Šต ๊ฒฐ๊ณผ

Ubuntu ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ ์ž‘์„ฑํ•˜์˜€์œผ๋ฉฐ ๋”ฐ๋กœ git์— ์—…๋กœ๋“œ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์†Œ์ผ“ ํ†ต์‹ ์„ ์ด์šฉํ•œ ํŒŒ์ผ ์ „์†ก ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ

1. client.c

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

void error_handling(char *message);

int main(int argc, char* argv[])
{
    int sock;  // ์†Œ์ผ“ ํŒŒ์ผ ์‹๋ณ„์ž
    struct sockaddr_in serv_addr;  // ์„œ๋ฒ„ ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด
    char message[100];  // ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฒ„ํผ
    int str_len;  // ์ฝ๊ฑฐ๋‚˜ ์“ด ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ
    int rfd;  // ํŒŒ์ผ ์ฝ๊ธฐ๋ฅผ ์œ„ํ•œ ํŒŒ์ผ ์‹๋ณ„์ž

    // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if(argc != 4)
    {
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(1);
    }
    // ํŒŒ์ผ์„ ์ฝ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด๊ธฐ
    rfd = open(argv[3], O_RDONLY);
    // ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if(rfd < 0)
    {
        perror("open()");
        error_handling("read() error");
    }
    // TCP ์†Œ์ผ“ ์ƒ์„ฑ
    sock = socket(PF_INET, SOCK_STREAM, 0);
    // ์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if(sock == -1)
        error_handling("socket() error");
    // ์„œ๋ฒ„ ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™”
    memset(&serv_addr, 0, sizeof(serv_addr));
    
    // ์„œ๋ฒ„ ์ฃผ์†Œ ์ •๋ณด ์„ค์ •
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_addr.sin_port = htons(atoi(argv[2]));

    // ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
    if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
        error_handling("connect() error!");
    do
    {
        // ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€์„œ ๋ฒ„ํผ์— ์ €์žฅ
        str_len = read(rfd, message, sizeof(message));
        // ์ฝ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
        if(str_len == 0)
            break;
        // ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„ ์†Œ์ผ“์œผ๋กœ ์ „์†ก
        write(sock, message, str_len);
    } while(1);
    // ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ๋‹ซ์€ ํ›„ ์ข…๋ฃŒ
    close(sock);
    return 0;
}
// ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
void error_handling(char *message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

2. server.c

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

void error_handling(char *message);

int main(int argc, char *argv[])
{
    int serv_sock;                 // ์„œ๋ฒ„ ์†Œ์ผ“ ํŒŒ์ผ ์‹๋ณ„์ž
    int clnt_sock;                 // ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ํŒŒ์ผ ์‹๋ณ„์ž
    struct sockaddr_in serv_addr;  // ์„œ๋ฒ„ ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด
    struct sockaddr_in clnt_addr;  // ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด
    socklen_t clnt_addr_size;      // ํด๋ผ์ด์–ธํŠธ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ
    char message[100];             // ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฒ„ํผ
    int str_len;                   // ์ฝ๊ฑฐ๋‚˜ ์“ด ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ
    int wfd;                       // ํŒŒ์ผ ์“ฐ๊ธฐ๋ฅผ ์œ„ํ•œ ํŒŒ์ผ ์‹๋ณ„์ž

    // ๋ช…๋ น์–ด ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if(argc != 3)
    {
        printf("Usage : %s <port> <file>\n", argv[0]);
        exit(1);
    }
    // ํŒŒ์ผ์„ ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด๊ธฐ (ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒ์„ฑ, ์ด๋ฏธ ์žˆ์œผ๋ฉด ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ์ƒ์„ฑ)
    wfd = open(argv[2], O_CREAT | O_TRUNC | O_WRONLY, 0644);

    // ํŒŒ์ผ ์—ด๊ธฐ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if(wfd < 0)
    {
        perror("error");
    }
    // TCP ์†Œ์ผ“ ์ƒ์„ฑ
    serv_sock = socket(PF_INET, SOCK_STREAM, 0);

    // ์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if(serv_sock == -1)
        error_handling("socket() error");
        
    // ์„œ๋ฒ„ ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™”
    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]));

    // ์†Œ์ผ“์— ์ฃผ์†Œ ํ• ๋‹น
    if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)
        error_handling("bind() error");
        
    // ์—ฐ๊ฒฐ ์š”์ฒญ ๋Œ€๊ธฐ ์ƒํƒœ ์ง„์ž…
    if(listen(serv_sock, 5) == -1)
        error_handling("listen() error");

    // ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
    clnt_addr_size = sizeof(clnt_addr);
    clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

    // ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
    if(clnt_sock == -1)
        error_handling("accept() error");
    do
    {
        // ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ด
        str_len = read(clnt_sock, message, sizeof(message));
        // ์ฝ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
        if(str_len <= 0)
            break;
        // ์ฝ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ์— ์“ฐ๊ธฐ
        write(wfd, message, str_len);
    } while(1);
    // ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“๊ณผ ์„œ๋ฒ„ ์†Œ์ผ“ ๋‹ซ์€ ํ›„ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
    close(clnt_sock);
    close(serv_sock);
    return 0;
}
// ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
void error_handling(char *message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

make ํŒŒ์ผ๋กœ ๋นŒ๋“œ

1. makefile

# Makefile ๋ณ€์ˆ˜ ์ •์˜
CC := gcc    # ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ 'gcc'๋กœ ์„ค์ •

# ์ปดํŒŒ์ผํ•  ๊ฐ์ฒด ํŒŒ์ผ๋“ค์˜ ๋ชฉ๋ก์„ ์ •์˜
OBJECTS_CLIENT = client.o
OBJECTS_SERVER = server.o
TARGET_CLIENT = client   # ๋นŒ๋“œํ•  ์‹คํ–‰ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ 'client'๋กœ ์„ค์ •
TARGET_SERVER = server   # ๋นŒ๋“œํ•  ์‹คํ–‰ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ 'server'๋กœ ์„ค์ •

# ๋นŒ๋“œ ๊ทœ์น™ ์ •์˜
$(TARGET_CLIENT): $(OBJECTS_CLIENT)
	$(CC) -o $@ $(OBJECTS_CLIENT)  # ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ

$(TARGET_SERVER): $(OBJECTS_SERVER)
	$(CC) -o $@ $(OBJECTS_SERVER)  # ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ

# ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™ ์ •์˜: ๊ฐ .c ํŒŒ์ผ์€ ํ•ด๋‹นํ•˜๋Š” .o ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ๋จ
%.o: %.c
	$(CC) -c -o $@ $<     # ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .c ํŒŒ์ผ์„ .o ํŒŒ์ผ๋กœ ๋ณ€ํ™˜
    
# 'clean' ๊ทœ์น™ ์ •์˜: ๋นŒ๋“œ๋œ ํŒŒ์ผ๋“ค ์ œ๊ฑฐ
clean:
	rm -f *.o $(TARGET_CLIENT) $(TARGET_SERVER)    # ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ .o ํŒŒ์ผ ๋ฐ ์‹คํ–‰ ํŒŒ์ผ ์ œ๊ฑฐ

 

2. ๋นŒ๋“œ ๊ฒฐ๊ณผ
๋นŒ๋“œ ๊ฒฐ๊ณผ server.c ํŒŒ์ผ์€ ๋นŒ๋“œ๋˜์ง€ ์•Š๊ณ  client.c ํŒŒ์ผ๋งŒ ๋นŒ๋“œ ๋˜์–ด
server.c ํŒŒ์ผ์€ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ๋นŒ๋“œ ํ•˜์˜€๋‹ค.

sudo gcc -o server server.c

make ํŒŒ์ผ๋กœ ๋นŒ๋“œ ๊ฒฐ๊ณผ
gcc ๋ช…๋ น์–ด๋กœ ๋นŒ๋“œ ๊ฒฐ๊ณผ

server, client ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰

1. server ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
์‚ฌ์šฉํ•  port ๋ฒˆํ˜ธ + ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์šฉ ํŒŒ์ผ ์„ ํƒ
(โ€ป ํ•ด๋‹น ๊ฒฝ๋กœ์— ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ์—ด๊ฑฐํ•˜๊ณ  ์—†์œผ๋ฉด ๋นˆ ํŒŒ์ผ ์ƒ์„ฑ)

server ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰

2. ์„œ๋ฒ„์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ ํŒŒ์ผ ์ƒ์„ฑ

send.txt

3. client ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
์„œ๋ฒ„ ip ์ฃผ์†Œ + ์‚ฌ์šฉํ•  port ๋ฒˆํ˜ธ + ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์šฉ ํŒŒ์ผ ์„ ํƒ

client ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰

 

์„œ๋ฒ„์— ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ๋จ ํ™•์ธ

๋ฐ์ดํ„ฐ ์ €์žฅ์šฉ ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ์‚ญ์ œ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋จ ํ™•์ธ

๋ฐ์ดํ„ฐ ์ €์žฅ ์„ฑ๊ณต

 

profile

Toby's Study Blog

@Toby12

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!

๊ฒ€์ƒ‰ ํƒœ๊ทธ