Toby's Study Blog
article thumbnail

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

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

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

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


์„œ๋ฒ„ ์ธก (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

 

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

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

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

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

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

1. client.c

<cpp />
#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

<cpp />
#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); }

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

1. makefile

<cpp />
# 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 ํŒŒ์ผ์€ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ๋นŒ๋“œ ํ•˜์˜€๋‹ค.

<cpp />
sudo gcc -o server server.c

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

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

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

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

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

send.txt

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

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

 

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

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

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

 

profile

Toby's Study Blog

@Toby12

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

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