๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[์ž๋™์ฐจ ๋’ทํŽธ์— LCDํŒ์œผ๋กœ ์ƒํ™ฉ ์ „๋‹ฌํ•˜๊ธฐ 2] TCP/IP ํ†ต์‹  ํ•จ์ˆ˜ ์‚ฌ์šฉ ์ˆœ์„œ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Arduino

[์ž๋™์ฐจ ๋’ทํŽธ์— LCDํŒ์œผ๋กœ ์ƒํ™ฉ ์ „๋‹ฌํ•˜๊ธฐ 2] TCP/IP ํ†ต์‹  ํ•จ์ˆ˜ ์‚ฌ์šฉ ์ˆœ์„œ

์ง•์ง•์•ŒํŒŒ์นด 2023. 11. 10. 11:41
728x90
๋ฐ˜์‘ํ˜•

โญ ์†Œ์ผ“

  • ๋‘ ํ”„๋กœ๊ทธ๋žจ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์–‘์ชฝ์— ์ƒ์„ฑ๋˜๋Š” ๋งํฌ์˜ ๋‹จ์ž
  • ์†Œ์ผ“์ด ์—ฐ๊ฒฐ๋˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿš€ Server

1) socket()

Socket discriptor ์ƒ์„ฑ

int socket(int domain, int type, int protocol);
  • ์„ฑ๊ณต ์‹œ fd (ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ), ์‹คํŒจ ์‹œ -1
  • domain : ์ฃผ์†Œ ์˜์—ญ ์„ค์ • (AF_INET(IPv4), AF_INET(IPv6))
  • type : ์†Œ์ผ“์˜ ํ†ต์‹  ํƒ€์ž… ์„ค์ •
  • protocol : ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ ์„ค์ •
  • memset ์œผ๋กœ ์ฃผ์†Œ๋ฅผ ๋ถ€์—ฌ
    • serv_sock์— bind๋กœ ์ฃผ์†Œ ๋„ฃ๊ธฐ ์œ„ํ•œ ๋ฐ‘์ž‘์—…
    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]));

 

2) bind()

์ƒ์„ฑํ•œ socket์— IP addr, portnumber ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ปค๋„์— server socket์œผ๋กœ ๋“ฑ๋ก

int bind(int sockfd, struct sockaddr* myaddr, socklen_t addrlen);
      • ์ฃผ์†Œ ์ •๋ณด (IP, PORT)๋ฅผ ํ• ๋‹นํ•ด์ค˜์•ผ ํ•จ
      • ์ปค๋„์— ๋“ฑ๋กํ•ด์•ผ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋จ
      • bind ์— ์‚ฌ์šฉํ•  ๊ตฌ์กฐ์ฒด๋Š” sockaddr_in ๊ตฌ์กฐ์ฒด (Socket sockaddr, sockaddr_in, sockaddr_un)
        • ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„๋ณ€์ˆ˜
          struct sockaddr_in
          {
              sa_family_t    sin_family;  ์ฃผ์†Œ์ฒด๊ณ„(Address Family)
              uint16_t       sin_port;    16๋น„ํŠธ TCP/UDP PORT๋ฒˆํ˜ธ
              struct in_addr sin_addr;    32๋น„ํŠธ์˜ IP์ฃผ์†Œ
              char           sin_zero[8]; ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ -> ??
          }
           
          struct in_addr{
              in_addr_t    s_addr;  32๋น„ํŠธ์˜ IPv4 ์ธํ„ฐ๋„ท ์ฃผ์†Œ๊ฐ€ ๋‹ด๊ธด๋‹ค.
          }
           
          struct sockaddr
          {
              sa_family_t sin_family    ์ฃผ์†Œ์ฒด๊ณ„(Address Family)
              char        sa_data[14];  ์ฃผ์†Œ์ •๋ณด
          }
          • ์„ฑ๊ณต ์‹œ 0, ์‹คํŒจ ์‹œ -1 ๋ฐ˜ํ™˜
          • sockfd : ์ƒ์„ฑํ•œ ์†Œ์ผ“์˜ fd ์ „๋‹ฌ
          • myaddr : ์ฃผ์†Œ ์ •๋ณด
          • addrlen : myaddr ์˜ ํฌ๊ธฐ

 

3) listen()

server socket ์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์ ‘์† ์š”์ฒญ์„ ํ™•์ธ

int listen(int sockfd, int backlog);
  • ์„ฑ๊ณต ์‹œ fd, ์‹คํŒจ ์‹œ -1 ๋ฐ˜ํ™˜
  • sockfd : ์†Œ์ผ“์˜ fd ์ „๋‹ฌ
  • backlog : ์—ฐ๊ฒฐ ์š”์ฒญ ๋Œ€๊ธฐ์—ด์˜ ํฌ๊ธฐ ์„ค์ •

 

4) accept()

ํด๋ผ์ด์–ธํŠธ ์ ‘์† ์š”์ฒญ ๋Œ€๊ธฐ ๋ฐ ์ˆ˜๋ฝ, ํด๋ผ์ด์–ธํŠธ์™€์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ์ƒˆ socket ์ƒ์„ฑ

int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
  • sockfd : ์†Œ์ผ“์˜ fd ์ „๋‹ฌ
  • addr : ์—ฐ๊ฒฐ ์š”์ฒญํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์ฃผ์†Œ ์ •๋ณด (์ •๋ณด ํ™•์ธ, ๋กœ๊ทธ ์ €์žฅ ๋ชฉ์ )
  • addrlen : addr ์˜ ํฌ๊ธฐ

 

5) read()/write()

socket ์œผ๋กœ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 

read(int fd, void *buff, size_t nbytes)

write(int fd, const void *buf, size_t nbytes);
  • read ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜
    • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋œ ์ž๋ฃŒ ์ˆ˜์‹ ํ•œ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋œ ์ž๋ฃŒ๊ฐ€ ์—†๋‹ค๋ฉด ์†ก์‹ ํ•  ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค
    • fd : ์—ด๋ฆฐ ํŒŒ์ผ์˜ ์ง€์ • ๋ฒˆํ˜ธ. ์—ฌ๊ธฐ์„œ fd๋Š” ์†Œ์ผ“ ์ง€์ •๋ฒˆํ˜ธ๋‹ค.
    • buff : ์ฝ์–ด๋“ค์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ๋ฒ„ํผ ๋ณ€์ˆ˜
    • count : ๋ฐ์ดํ„ฐ์˜ count ํฌ๊ธฐ
  • memset ํ•จ์ˆ˜
    • ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ์—ฐ์†๋œ ๋ฒ”์œ„๋ฅผ ํŠน์ •๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
      • ptr : ๋ฉ”๋ชจ๋ฆฌ ์‹œ์ž‘ ํฌ์ธํ„ฐ
      • value : ์ฑ„์šฐ๋Š” ๊ฐ’
      • num : ์ฑ„์šฐ๋ ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ
  • write ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜
    • ํด๋ผ์ด์–ธํŠธ๋กœ ์ž๋ฃŒ๋ฅผ ์†ก์‹ ํ•œ๋‹ค
    • fd : ์—ด๋ฆฐ ํŒŒ์ผ์˜ ์ง€์ • ๋ฒˆํ˜ธ. ์†Œ์ผ“ ์ง€์ •๋ฒˆํ˜ธ
    • buf : ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’, ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ
    • count : ๋ฐ์ดํ„ฐ์˜ count ํฌ๊ธฐ

 

6) close()

ํ†ต์‹ ์„ ์™„๋ฃŒํ•˜๋ฉด socket ์„ ์†Œ๋ฉธ

close(int fd);
  • sockfd : ์†Œ์ผ“ ์ง€์ • ๋ฒˆํ˜ธ

 

๐Ÿš€ Client

1) socket()

Socket discriptor ์ƒ์„ฑ

int socket(int domain, int type, int protocol);
  • ์„ฑ๊ณต ์‹œ fd (ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ), ์‹คํŒจ ์‹œ -1
  • domain : ์ฃผ์†Œ ์˜์—ญ ์„ค์ • (AF_INET(IPv4), AF_INET(IPv6))
  • type : ์†Œ์ผ“์˜ ํ†ต์‹  ํƒ€์ž… ์„ค์ •
  • protocol : ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ ์„ค์ •
  • memset ์œผ๋กœ ์ฃผ์†Œ๋ฅผ ๋ถ€์—ฌ
    • serv_sock์— bind๋กœ ์ฃผ์†Œ ๋„ฃ๊ธฐ ์œ„ํ•œ ๋ฐ‘์ž‘์—…
       // serv_sock์— bind ๋กœ ์ฃผ์†Œ ๋„ฃ๊ธฐ ์œ„ํ•œ ๋ฐ‘์ž‘์—…
       memset(&serv_adr, 0, sizeof(serv_adr));
    
       // Prepare the address
       serv_adr.sin_family = AF_INET;                     // type : IPv4
       serv_adr.sin_addr.s_addr = inet_addr(argv[1]);     // ip์ฃผ์†Œ
       serv_adr.sin_port = htons(atoi(argv[2]));          // ํฌํŠธ๋ฒˆํ˜ธ

 

2) bind()

server ๋กœ ์—ฐ๊ฒฐ ์‹œ๋„

int connect(int sockfd, struct sockaddr* serv_addr, socklen_t addrlen);
  • ์„œ๋ฒ„์—์„œ accept ํ–ˆ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ์ชฝ์—์„œ ์—ฐ๊ฒฐ ์š”์ฒญํ•ด์•ผ ํ•จ
  • ์ฃผ์†Œ ์ •๋ณด์— ์„œ๋ฒ„์˜ ์ฃผ์†Œ์™€ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ ์‹œ๋„
    • sockfd : ์†Œ์ผ“ ์ง€์ • ๋ฒˆํ˜ธ
    • serv_addr : ์„œ๋ฒ„์˜ ip์ฃผ์†Œ ํฌํŠธ ์ •๋ณด
    • addrlen : addr ์˜ ํฌ๊ธฐ

 

3) read()/write()

socket ์œผ๋กœ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 

read(int fd, void *buff, size_t nbytes)

write(int fd, const void *buf, size_t nbytes);
  • read ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜
    • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋œ ์ž๋ฃŒ ์ˆ˜์‹ ํ•œ๋‹ค.
      • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋œ ์ž๋ฃŒ๊ฐ€ ์—†๋‹ค๋ฉด ์†ก์‹ ํ•  ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค
    • fd : ์—ด๋ฆฐ ํŒŒ์ผ์˜ ์ง€์ • ๋ฒˆํ˜ธ. ์—ฌ๊ธฐ์„œ fd๋Š” ์†Œ์ผ“ ์ง€์ •๋ฒˆํ˜ธ๋‹ค.
    • buff : ์ฝ์–ด๋“ค์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋  ๋ฒ„ํผ ๋ณ€์ˆ˜
    • count : ๋ฐ์ดํ„ฐ์˜ count ํฌ๊ธฐ
  • memset ํ•จ์ˆ˜
    • ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ์—ฐ์†๋œ ๋ฒ”์œ„๋ฅผ ํŠน์ •๊ฐ’์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
      • ptr : ๋ฉ”๋ชจ๋ฆฌ ์‹œ์ž‘ ํฌ์ธํ„ฐ
      • value : ์ฑ„์šฐ๋Š” ๊ฐ’
      • num : ์ฑ„์šฐ๋ ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ
  • write ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜
    • ํด๋ผ์ด์–ธํŠธ๋กœ ์ž๋ฃŒ๋ฅผ ์†ก์‹ ํ•œ๋‹ค
    • fd : ์—ด๋ฆฐ ํŒŒ์ผ์˜ ์ง€์ • ๋ฒˆํ˜ธ. ์†Œ์ผ“ ์ง€์ •๋ฒˆํ˜ธ
    • buf : ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’, ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ
    • count : ๋ฐ์ดํ„ฐ์˜ count ํฌ๊ธฐ

 

4) close()

ํ†ต์‹ ์„ ์™„๋ฃŒํ•˜๋ฉด socket ์„ ์†Œ๋ฉธ

close(int fd);
  • sockfd : ์†Œ์ผ“ ์ง€์ • ๋ฒˆํ˜ธ
728x90
๋ฐ˜์‘ํ˜•
Comments