TCP IP - Leo-Mun/UROP_SDN GitHub Wiki

์†Œ์ผ“(socket)

  • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์˜ ์ข…์ฐฉ์ , ํ˜„๋Œ€์—” ๋Œ€๋ถ€๋ถ„ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ '์ธํ„ฐ๋„ท ์†Œ์ผ“'์ด๋ผ ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ตฌ์„ฑ์š”์†Œ
    1. ๋กœ์ปฌ IP์ฃผ์†Œ (์ž์‹ ์˜ IP์ฃผ์†Œ)
    2. ๋กœ์ปฌ ํฌํŠธ (์ž์‹ ์˜ ํฌํŠธ๋ฒˆํ˜ธ)
    3. ์›๊ฒฉ IP ์ฃผ์†Œ (์ƒ๋Œ€๋ฐฉ์˜ IP์ฃผ์†Œ)
    4. ์›๊ฒฉ ํฌํŠธ (์ƒ๋Œ€๋ฐฉ์˜ ํฌํŠธ๋ฒˆํ˜ธ)

์ธํ„ฐ๋„ท ์†Œ์ผ“์€ ํฌ๊ฒŒ TCP(์—ฐ๊ฒฐ์ง€ํ–ฅํ˜•, Stream), UDP(๋น„ ์—ฐ๊ฒฐ์ง€ํ–ฅํ˜•, ๋ฐ์ดํ„ฐ๊ทธ๋žจ ์„œ๋น„์Šค)๋กœ ๊ตฌ๋ณ„

  1. ์—ฐ๊ฒฐ์ง€ํ–ฅํ˜•
    • ์ „์†ก ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ์˜ ์†Œ๋ฉธ ์—†์ด ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ „์†ก
    • ์ „์†ก๋œ ์ˆœ์„œ๋Œ€๋กœ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ „์†ก
    • ์ „์†ก๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ๊ณ„๊ฐ€ ์—†์Œ -> ํ˜ธ์ถœ๋œ read(), write() ์˜ ํšŸ์ˆ˜๊ฐ€ ์ƒ๊ด€์—†์Œ.
    • ์†Œ์ผ“ : ์†Œ์ผ“ ์˜ ์—ฐ๊ฒฐ์€ ๋ฐ˜๋“œ์‹œ 1๋Œ€1 ์ด์–ด์•ผํ•จ
  • ์‹ ๋ขฐ์„ฑ์ด ์žˆ๋Š” ์ˆœ์ฐจ์  ๋ฐ”์ดํŠธ๊ธฐ๋ฐ˜์˜ ์—ฐ๊ฒฐ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ ์ „์†ก๋ฐฉ์‹์˜ ์†Œ์ผ“
  1. ๋น„ ์—ฐ๊ฒฐ์ง€ํ–ฅํ˜•
    • ์ „์†ก๋œ ์ˆœ์„œ๋ณด๋‹ค๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์ „์†ก์„ ์ง€ํ–ฅ (์†๋„์šฐ์„ )
    • ์ „์†ก์ค‘ ๋ฐ์ดํ„ฐ์˜ ์†์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌ (ํŒŒ์† or ์†Œ๋ฉธ)
    • ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ๊ณ„๊ฐ€ ์กด์žฌ
    • ํ•œ ๋ฒˆ์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ œํ•œ์ด ์žˆ์Œ
  • ์‹ ๋ขฐ์„ฑ, ์ˆœ์ฐจ์  ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ณ  ๊ณ ์†์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ์†Œ์ผ“

์†Œ์ผ“์ƒ์„ฑ ์ˆœ์„œ

  1. ์ฃผ์†Œ์ฒด๊ณ„(ํ”„๋กœํ† ์ฝœ)์— ๋Œ€ํ•œ ์ •๋ณด์ „๋‹ฌ
    1. AF_INET : IPv4 ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ ์ฃผ์†Œ์ฒด๊ณ„
    2. AF_INET6 : IPv6 ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ ์ฃผ์†Œ์ฒด๊ณ„
    3. AF_LOCAL : ๋กœ์ปฌ ํ†ต์‹  ๋ชฉ์ ์˜ ์œ ๋‹‰์Šค ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„
  2. ์†Œ์ผ“ ํƒ€์ž… ์ •๋ณด์ „๋‹ฌ
    1. SOCK_STREAM (TCP)
    2. SOCK_DGRAM (UDP)
  3. ํ”„๋กœํ† ์ฝœ์˜ ์ตœ์ข… ์„ ํƒ
    • ๋™์ผํ•œ ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„์—์„œ ๋ฐ์ดํ„ฐ ์ „์†ก๋ฐฉ์‹์— ์žˆ์–ด์„œ ๋™์ผํ•œ ํ”„๋กœํ† ์ฝœ์ด 2๊ฐœ ์ด์ƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•จ

์ฃผ์†Œ ์ฒด๊ณ„

  1. ์ธํ„ฐ๋„ท ์ฃผ์†Œ

    • ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์„ ์œ„ํ•ด์„  IP๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์ด๋Ÿฌํ•œ IP์ฃผ์†Œ์ฒด๊ณ„์—” 2๊ฐ€์ง€ ์กด์žฌ (IPv4, IPv6)
    • ๋‘˜์˜ ์ฐจ์ด๋Š” ์ฃผ์†Œ ํ‘œํ˜„์— ์‚ฌ์šฉ ๋˜๋Š” ๋ฐ”์ดํŠธ์ˆ˜. (๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ ๋˜๋Š” ์ฃผ์†Œ์ฒด๊ณ„๋Š” IPv4)
    • ๋„คํŠธ์›Œํฌ์ฃผ์†Œ, ํ˜ธ์ŠคํŠธ์ฃผ์†Œ๋กœ ๋ถ„๋ฅ˜. ์ด ๋•Œ ์ฃผ์†Œ์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ 4๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ (Eํด๋ž˜์Šค๋Š” ์˜ˆ์•ฝ ํด๋ž˜์Šค)
    • A : 8-bit network ID, 24-bit host ID
    • B : 16-bit network ID, 16-bit host ID
    • C : 24-bit network ID, 8-bit host ID
    • D : Multicast applications
  2. Port ๋ฒˆํ˜ธ

    • ํ•˜๋‚˜์˜ ์šด์˜์ฒด์ œ ๋‚ด์—์„œ ์†Œ์ผ“์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ, ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•˜๋‚˜์˜ ์šด์˜์ฒด์ œ์—์„œ ๋™์ผํ•œ port๋ฒˆํ˜ธ๋ฅผ ๋‘ฅ ์ด์ƒ ํ• ๋‹น ํ•  ์ˆ˜ ์—†๋‹ค.
    • ํ‘œํ˜„ ๋ฒ”์œ„๋Š” 0์ด์ƒ 65535์ดํ•˜ (16-bit) ๋‹จ, 0-1023 ์€ Well-known PORT ๋ผ์„œ ์“ธ ์ˆ˜ ์—†์Œ?( ์ž˜ ์•Œ๋ ค์ง„ ํฌํŠธ(well-known port)๋Š” ํŠน์ •ํ•œ ์“ฐ์ž„์ƒˆ๋ฅผ ์œ„ํ•ด์„œ IANA์—์„œ ํ• ๋‹นํ•œ TCP ๋ฐ UDP ํฌํŠธ ๋ฒˆํ˜ธ์˜ ์ผ๋ถ€์ด๋‹ค. ์ด ๋ฒˆํ˜ธ๋Š” ๊ฐ•์ œ์ ์œผ๋กœ ์ง€์ •๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, IANA์˜ ๊ถŒ๊ณ ์•ˆ์ผ ๋ฟ์ด๋‹ค. ๊ฐ€๋” ๊ฐ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, ํŠธ๋กœ์ด ๋ชฉ๋งˆ์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์•…์˜์ ์ธ ๋ชฉ์ ์œผ๋กœ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.) .
    • ํ•˜๋‚˜์˜ ์šด์˜์ฒด์ œ ๋‚ด์—์„œ ๋™์ผํ•œ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•  ์ˆœ ์—†์ง€๋งŒ TCP, UDP์†Œ์ผ“์—๋Š” ๋™์ผํ•œ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ „์†ก์˜ ๋ชฉ์ ์ง€ ์ฃผ์†Œ์—๋Š” IP์ฃผ์†Œ์™€ ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ์žˆ์–ด์•ผ ๋จ

์ฃผ์†Œ์˜ ํ‘œํ˜„

IPv4์˜ ์ฃผ์†Œ์ฒด๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 'sockaddr_in'๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉ

sockaddr_in ๊ตฌ์„ฑ

     struct sockaddr_in
     {
        sa_family_t    sin_family;
        unit16_t       sin_port;
        struct in_addr sin_addr;
        char           siz_zero[8];
     }   
     struct in_addr
     {   
        in_addr_t s_addr; // IPv4 address (32-bit)
     }
  1. sin_family
    • ์ฃผ์†Œ์ฒด๊ณ„๋ฅผ ์˜๋ฏธ
    • ์ข…๋ฅ˜๋กœ๋Š” AF_INET(IPv4 ํ”„๋กœํ† ์ฝœ), AF_INET6(IPv6 ํ”„๋กœํ† ์ฝœ), AF_LOCAL(Localํ†ต์‹  ์œ ๋‹‰์Šค ํ”„๋กœํ† ์ฝœ) ์ด ์กด์žฌ
  2. sin_port
    • 16๋น„ํŠธ Port๋ฒˆํ˜ธ๋ฅผ ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ์ €์žฅ
  3. sin_addr
    • 32๋น„ํŠธ์˜ IP์ฃผ์†Œ๋ฅผ ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ์ €์žฅ
  4. sin_zero
    • sockaddr_in๊ณผ sockaddr์˜ ํฌ๊ธฐ๋ฅผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฝ์ž…๋œ ๋ฉค๋ฒ„.
    • ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋Š” ์—†์ง€๋งŒ ๊ณต๊ฐ„์„ ์ฑ„์šธ๋• ๋ฐ˜๋“œ์‹œ 0์œผ๋กœ ์ฑ„์›Œ์•ผ ํ•จ.

sockaddr ๊ตฌ์กฐ์ฒด

     struct sockaddr
     {
         sa_family_t sin_family;  // ์ฃผ์†Œ์ฒด๊ณ„
         char        sa_data[14]; // ์ด๊ณณ์— IP์ฃผ์†Œ, Port ๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋‹ค.
     }

๊ฐ ๋ฉค๋ฒ„์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ ํ›„, ๋‚จ๋Š” ๋ถ€๋ถ„์„ 0์œผ๋กœ ์ฑ„์›Œ์„œ sockaddr_in๊ณผ sockaddr์˜ ํฌ๊ธฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งž์ถฐ์ค€๋‹ค.

์ธํ„ฐ๋„ท ์ฃผ์†Œ์˜ ์ดˆ๊ธฐํ™”, ํ• ๋‹น

  • ํ”ํžˆ ์•Œ๊ณ  ์žˆ๋Š” "xxx.xxx.xxx.xxx"๋Š” ์‹ญ์ง„์ˆ˜ ํ‘œํ˜„๋ฐฉ์‹(Dotted-Decimal Notation). ํ•˜์ง€๋งŒ ์ปดํ“จํ„ฐ๋Š” ์ด๊ฒƒ์„ ํ•˜๋‚˜์˜ ์ •์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ด์ค˜์•ผํ•œ๋‹ค.
  1. inet_addr()

      in_addr_t inet_addr(const char *string);
    

๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ๋Š” ๋ณ€ํ™˜์— ์„ฑ๊ณต์‹œ ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ(๋น… ์—”๋””์•ˆ)์œผ๋กœ ๋ณ€ํ™˜๋œ 32๋น„ํŠธ์˜ ์ •์ˆ˜๊ฐ’, ์‹คํŒจ ์‹œ INADDR_NONE ๊ฐ€ ๋ฐ˜ํ™˜ ๋จ

  1. inet_aton()

     int inet_aton(const char *string, struct in_addr *addr); 
    

string : ๋ณ€ํ™˜ํ•  IP์ฃผ์†Œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ๋ฌธ์ž์—ด
aadr : ๋ณ€ํ™˜๋œ ์ •๋ณด๋ฅผ ์ €์žฅํ•  in_addr ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜
๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ๋Š” ์„ฑ๊ณต์‹œ 1, ์‹คํŒจ ์‹œ 0 ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
inet_addr()๊ณผ ์ฐจ์ด๋Š” in_addr ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

  1. inet_ntoa()

    char *inet_ntoa(struct in_addr adr);
    

์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์ •์ˆ˜ํ˜•ํƒœ์˜ IP์ฃผ์†Œ๊ฐ’์„ ๋ฌธ์ž์—ด ํ˜•ํƒœ์˜ IP์ฃผ์†Œ ์ •๋ณด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜. ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ๋Š” ์„ฑ๊ณต์‹œ ๋ณ€ํ™˜๋œ ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๊ฐ’, ์‹คํŒจ ์‹œ -1 ๊ฐ€ ๋ฐ˜ํ™˜.

TCP/IP ์Šคํƒ๊ตฌ์กฐ

  • ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ๊ณผ์ •์„ 4๋‹จ๊ณ„๋กœ ๊ณ„์ธตํ™”.
  • ์ด๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ์Œ.
    1. ํ”„๋กœํ† ์ฝœ ์„ค๊ณ„์˜ ์šฉ์ด์„ฑ
    2. ํ‘œ์ค€ํ™” ์ž‘์—…์„ ํ†ตํ•œ ๊ฐœ๋ฐฉํ˜• ์‹œ์Šคํ…œ ์„ค๊ณ„ (ex. ๋žœ์นด๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ฌด ๋žœ์นด๋“œ๋ฅผ ์‚ฌ์„œ ๊ฝ‚์œผ๋ฉด ๋จ)

  1. Link ๊ณ„์ธต
    • ๋ฌผ๋ฆฌ์ ์ธ ์˜์—ญ์œผ๋กœ LAN, WAN, MAN ์ด ์†ํ•˜๋Š” ์˜์—ญ
  2. IP๊ณ„์ธต
    • ๋ชฉ์ ์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ์‹œ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณ„์ธต. ์ด ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด IP(Internet Protocol).
    • IP ์ž์ฒด๋Š” ๋น„ ์—ฐ๊ฒฐ ์ง€ํ–ฅ์„ฑ์ด๋ผ ๋ฌด์กฐ๊ฑด ์‹ ๋ขฐํ•  ์ˆ˜๋Š” ์—†๋‹ค.
  3. TCP/IP ๊ณ„์ธต
    • ๊ฒฝ๋กœ๋Š” ์ด๋ฏธ IP๊ณ„์ธต์—์„œ ์„ค์ •, ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๊ณ„์ธต์ด๋‹ค. ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ TCP, UDP๋กœ ๊ตฌ๋ณ„.
    • TCP์˜ ๊ธฐ๋ฐ˜์€ IP๊ฐ€ ๋˜๊ณ , IP์ž์ฒด๊ฐ€ 1๊ฐœ์˜ ํŒจํ‚ท์„ ์ „์†กํ•˜๋Š” ๊ฒฝ๋กœ์—๋งŒ ์ง‘์ค‘. -> ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ „์†กํ•ด๋„ ๋ชจ๋‘ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ™์ง€์•Š๊ณ  ์ˆœ์„œ๋„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Œ.
    • ์ด๋Ÿฌํ•œ IP์— TCP๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ์†ก์ˆ˜์‹ ์‹œ ์†์‹ค๋˜๋Š” data๋ฅผ ๊ฒ€์‚ฌ. ์ด๋กœ์จ ์ „์†ก๋˜๋Š” data๊ฐ€ ๋ณด์žฅ์ด ๋œ๋‹ค.
  4. Application ๊ณ„์ธต
    • ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ server, client๋กœ ๊ตฌ๋ณ„, ์ด ๋•Œ ๊ทœ์•ฝ(Protocol)์ด ์ƒ์„ฑ.
    • ๋Œ€๋ถ€๋ถ„์˜ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์†ํ•œ๋‹ค.
  • ๊ฐ ๊ณ„์ธต์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ด SW ์ผ์ˆ˜๋„ ์žˆ๊ณ (SDN), NIC์™€ ๊ฐ™์€ ๋ฌผ๋ฆฌ์  ์žฅ์น˜์ผ ์ˆ˜ ์žˆ๋‹ค.(์ „ํ†ต์ ์ธ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ๋ฐฉ์‹)

TCP ์„œ๋ฒ„ ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ํ•จ์ˆ˜๋“ค

1. socket()

  • ์†Œ์ผ“ ์ƒ์„ฑ์‹œ ์‚ฌ์šฉ ๋˜๋Š” ํ•จ์ˆ˜

    int socket(int domain, int type, int protocol);
    

domain : ์†Œ์ผ“์ด ์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„ ์ •๋ณด.
type : ์†Œ์ผ“์˜ ๋ฐ์ดํ„ฐ ์ „์†ก๋ฐฉ์‹์— ๋Œ€ํ•œ ์ •๋ณด.
protocol : ๋””๋ฐ”์ด์Šค๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉ ๋˜๋Š” ํ”„๋กœํ† ์ฝœ ์ •๋ณด.

2. bind()

  • ์ดˆ๊ธฐํ™”๋œ ์ฃผ์†Œ์ •๋ณด๋ฅผ ์†Œ์ผ“์—๊ฒŒ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜.

     int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
    

sockfd : ์ฃผ์†Œ์ •๋ณด๋ฅผ ํ• ๋‹นํ•  ์†Œ์ผ“์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ
myaddr : ํ• ๋‹นํ•˜๊ณ ์ž ํ•˜๋Š” ์ฃผ์†Œ์ •๋ณด๋ฅผ ์ง€๋‹Œ ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜
addrlen : 2๋ฒˆ์งธ ์ธ์ž์˜ ๊ธธ์ด์ •๋ณด

3. listen()

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋Š” '์—ฐ๊ฒฐ์š”์ฒญ ๋Œ€๊ธฐ์ƒํƒœ'๊ฐ€ ๋˜๋Š” ํ•จ์ˆ˜.

     int listen(int sock, int backlog);
    

sock : ์—ฐ๊ฒฐ ๋Œ€๊ธฐ์ƒํƒœ์— ๋‘๊ณ ์ž ํ•˜๋Š” ์†Œ์ผ“์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ.
backlog : ์—ฐ๊ฒฐ์š”์ฒญ ๋Œ€๊ธฐ ํ์˜ ํฌ๊ธฐ์ •๋ณด.

4. accept()

  • ๋Œ€๊ธฐ ํ์—์„œ ๋Œ€๊ธฐ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ํ•จ์ˆ˜.

    int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);
    

sock : ์„œ๋ฒ„ ์†Œ์ผ“์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ.
addr : ์—ฐ๊ฒฐ์š”์ฒญํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์ฃผ์†Œ์ •๋ณด๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜, ์™„๋ฃŒ ์‹œ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์˜ ์ฃผ์†Œ์ •๋ณด๊ฐ€ ์ฑ„์›Œ์ง„๋‹ค.
addrlen : ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ์˜ ๋ณ€์ˆ˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ „๋‹ฌ.

5. connect()

  • ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ ๋˜๋Š” ํ•จ์ˆ˜๋กœ์จ, ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์š”์ฒญ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ํ•จ์ˆ˜.

    int connect(int sock, sockaddr *servaddr, socklen_t addrlen)

sock : ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ. servaddr : ์—ฐ๊ฒฐ์š”์ฒญํ•  ์„œ๋ฒ„์˜ ์ฃผ์†Œ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜. addrlen : 2๋ฒˆ์งธ ์ธ์ž์˜ ์ฃผ์†Œ์˜ ๋ฐ”์ดํŠธ๋‹จ์œ„ ๊ธธ์ด์ •๋ณด.

๊ฐ„๋‹จํ•œ "Hello World" ์„œ๋ฒ„ ์†Œ์Šค์ฝ”๋“œ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.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[] = "Hello Stranger!";

	if( argc != 2)
	{
		printf("Usage : %s <port>\n",argv[0]);
		exit(1);
	}

	serv_sock = socket(PF_INET, SOCK_STREAM, 0); // socket create
	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) // bind func call
		error_handling("bind() error");

	if( listen(serv_sock, 20) == -1) // listen func call
		error_handling("listen() error");

	clnt_addr_size = sizeof(clnt_addr);
	clnt_sock = accept( serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); // accept func call 
	if( clnt_sock == -1 )
		error_handling("accept() error");

	write(clnt_sock, message, sizeof(message)); // data trade, if white func call => linking sign exist
	close(clnt_sock);
	close(serv_sock);

	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค์ฝ”๋“œ

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

void error_handling(char *message);

int main(int argc, char *argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[30];
	int str_len = 0;
	int idx = 0, read_len = 0;

	if( argc != 3 )
	{
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}

	if( (sock = socket(PF_INET, SOCK_STREAM, 0)) == -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");

	if( recv(sock, message, sizeof(message), 0) == -1 )
		error_handling("recv() error!");

	printf("Message from server : %s \n",message );

	close(sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ํ†ต์‹  ๊ณผ์ •์€ ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • send(), recv()์™€ read(), write()์˜ ์ฐจ์ด
    • send(), recv()๋Š” ํ†ต์‹ ์— ์ข€ ๋” ํŠนํ™”๋œ ํ•จ์ˆ˜๋กœ์จ socket lib์— ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.
    • read(), write()๋Š” ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉ ๋˜๋Š” ๋ฒ”์šฉ์ ์ธ ํ•จ์ˆ˜๋กœ์จ ์‚ฌ์šฉ ์‹œ OS๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค„ ์ˆ˜ ๋„ ์žˆ๋‹ค.
    • ํฐ ์ฐจ์ด์ ์ค‘ ํ•˜๋‚˜๋Š” flag๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด send(), recv() ์‚ฌ์šฉ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด read(), write()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ