๋ชฉ๋ก

์†Œ์ผ“๋งŒ๋“ค๊ธฐ

์›ํ™œํ•œ ์„œ๋ฒ„๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„ํ”Œ๋จธ๋ถ„๊ณผ์˜ ํ˜‘์—…์„ ์œ„ํ•ด

์†Œ์ผ“๋ถ€๋ถ„ ์˜ˆ์ œ ๊ณต๋ถ€

3. ๋ฒ„ํด๋ฆฌ ์†Œ์ผ“

(๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ 3์ฑ•ํ„ฐ ์ •๋ฆฌ)

๋ฒ„ํด๋ฆฌ ์†Œ์ผ“ API๋Š” BSD4.2 ์šด์˜์ฒด์ œ์˜ ์ผ๋ถ€๋กœ ๋ฐฐํฌ ๋˜์—ˆ๋Š”๋ฐ, ํ”„๋กœ์„ธ์Šค์™€ TCP/IP ์Šคํƒ์˜ ์—ฌ๋Ÿฌ ๊ณ„์ธต ์‚ฌ์ด์— ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์“ฐ๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜์—ˆ๋‹ค.

๋ฐฐํฌ ์ดํ›„ ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ์— ์–ธ์–ด ํฌํŒ…๋˜์–ด ์‚ฌ์‹ค์ƒ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ‘œ์ค€!

1. ์†Œ์ผ“ ๋งŒ๋“ค๊ธฐ

  • ์†Œ์ผ“ ์ƒ์„ฑ ์€ ๊ฐ„๋‹จํ•˜๋‹ค.

    SOCKET socket(int af, int type, int protocol);
    • af ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฃผ์†Œ ํŒจ๋ฐ€๋ฆฌ๋ฅผ ๋œปํ•˜๋ฉฐ, ์†Œ์ผ“์— ์“ฐ์ผ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
      AF_UNSPEC : ์ง€์ •ํ•˜์ง€ ์•Š์Œ
      AF_INET : ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ(๋ฒ„์ „ 4)
      AF_IPX : IPX(์˜ˆ์ „์— ๋งŽ์ด ์“ฐ๋˜ ๋„ท์›Œํฌ ํ”„๋กœํ† ์ฝœ)
      AF_APPLETALK: ์• ํ”Œํ† ํฌ(๊ตฌํ˜• ๋งคํ‚จํ† ์‹œ์šฉ)
      AF_INET6 : ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ(๋ฒ„์ „ 6)
      ์š”์ฆ˜ ๊ฒŒ์ž„ ๋งŒ๋“ค ๋• ๋Œ€๊ฒŒ IPv4๊ฐ€ ๊ธฐ์ค€์ด๋ฏ€๋กœ AF_INET์“ฐ๋ฉด ๋ฌด๋‚œ.

    • type ์†Œ์ผ“์„ ์ฃผ๊ณ  ๋ฐ›์„ ํŒจํ‚ท์ข…๋ฅ˜ ์ง€์ •, ์ด ๊ฐ’์— ๋”ฐ๋ผ ์†Œ์ผ“์ด ์‚ฌ์šฉํ•˜๋Š” ์ „์†ก ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ์ด ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„๋‹ค.
      SOCK_STREAM : ์ˆœ์„œ์™€ ์ „๋‹ฌ์ด ๋ณด์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ, ์ŠคํŠธ๋ฆผ์˜ ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ํŒจํ‚ท์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์Œ.
      SOCK_DGRAM : ๊ฐ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ํŒจํ‚ท์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์Œ.
      SOCK_RAW : ํŒจํ‚ท ํ—ค๋”๋ฅผ ์‘์šฉ ๊ณ„์ธต์—์„œ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.
      SOCK_SEQPACKET: SOCK_STREAM๊ณผ ์œ ์‚ฌํ•˜๋‚˜ ํŒจํ‚ท ์ˆ˜์‹  ์‹œ ํ•ญ์ƒ ์ „์ฒด๋ฅผ ์ฝ์–ด ๋“ค์—ฌ์•ผ ํ•จ.

      ์†Œ์ผ“ ํƒ€์ž…์„ SOK_STREAM์œผ๋กœ ํ•˜๋ฉด -> ์ƒํƒœ์œ ์ง€ํ˜• ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉฐ(๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ• ์ˆ˜ ์žˆ๊ฒŒ ํ•„์š” ๋ฆฌ์†Œ์Šค ํ• ๋‹น), ์‹ ๋ขฐ์„ฑ ์žˆ๊ณ  ์ˆœ์„œ ๋ณด์žฅ๋˜๋ฏ€๋กœ -> TCPํ”„๋กœํ† ์ฝœ์— ์–ด์šธ๋ฆฌ๋Š” ์†Œ์ผ“ ํ˜•์‹. SOCK_DGRAM์œผ๋กœ ์‚ฌ์šฉ ์‹œ ์—ฐ๊ฒฐ ์ƒํƒœ ์œ ์ง€ํ•  ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์ตœ์†Œํ•œ์˜ ๋ฆฌ์†Œ์Šค๋งŒ ํ• ๋‹น -> ์‹ ๋ขฐ์„ฑ ์‹ ๊ฒฝX, ํŒจํ‚ท์˜ ์ˆœ์„œ๋ณด์žฅX -> UDP ํ”„๋กœํ† ์ฝœ์— ์–ด์šธ๋ฆฐ๋‹ค.

    • protocol ์†Œ์ผ“์ด ๋ฐ์ดํ„ฐ ์ „์†ก์— ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ์˜ ์ข…๋ฅ˜๋ฅผ ๋ช…์‹œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ. ์ „์†ก ๊ณ„์ธต ๋˜๋Š” ๊ฐ์ข… ์ธํ„ฐ๋„ท ์œ ํ‹ธ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณดํŽธ์ ์œผ๋กœ protocol ํŒŒ๋žŒ ์ง€์ •ํ•œ ๊ฐ’์€ ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” IP ํ—ค๋”์˜ ํ”„๋กœํ† ์ฝœ ํ•„๋“œ์— ์ง์ ‘ ๊ธฐ๋ก(๋…ธ์ถœ๋ ์ˆ˜ ์ž‡๋‹ค?) ๊ทธ๋Ÿฌ๋ฉด ์ˆ˜์‹  ์ธก ์šด์˜์ฒด์ œ๊ฐ€ ์ด ๊ฐ’์œผ๋กœ ํŒจํ‚ท์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด์ผ€ ํ•ด์„ํ• ์ง€ ํŒ๋‹จ.
      IPPROTO_UDP : ํ•„์š”์†Œ์ผ“ ์ข…๋ฅ˜๋Š” SOCKDGRAM์ด๋ฉฐ, ์˜๋ฏธ๋Š” UDP๋ฐ์ดํ„ฐ๊ทธ๋žจ ํŒจํ‚ท.
      __IPPROO
      TCP__ : ํ•„์š”์†Œ์ผ“ ์ข…๋ฅ˜๋Š” SOCKSTREAM์ด๋ฉฐ, ์˜๋ฏธ๋Š” TCP ์„ธ๊ทธ๋จผํŠธ ํŒจํ‚ท.
      __IPPROTO
      IP ๋˜๋Š” 0__ : ํ•„์š”์†Œ์ผ“ ์ข…๋ฅ˜๋Š” ์ƒ๊ด€์—†๊ณ , ์˜๋ฏธ๋Š” ์ฃผ์–ด์ง„ ์†Œ์ผ“ ์ข…๋ฅ˜์˜ ๋””ํดํŠธ ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ.
      ์—ฌ๊ธฐ์„œ ์•Œ์•„๋‘๋ฉด ํŽธ๋ฆฌํ•œ ๊ฒƒ์€ ํ”„๋กœํ† ์ฝœ์„ 0์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์šด์˜์ฒด์ œ๊ฐ€ ์•Œ์•„์„œ ์†Œ์ผ“ ํ˜•์‹์— ๋งž๋Š” ๋””ํดํŠธ ํ”„๋กœํ† ์ฝœ๋กœ ๊ณจ๋ผ์ค€๋‹ค๋Š” ์ .

    IPv4UDP ์†Œ์ผ“์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœ

    SOCKET udpSocket = socket(AF_INET, SOCK_DGRM, 0);

    TCP ์†Œ์ผ“์€ ์ด๋ ‡๊ฒŒ..

    SOCKET tcpSocket = socket(AF_INET, SOCK_STREAM, 0);

    ์†Œ์ผ“ ์ข…๋ฅ˜ ์ƒ๊ด€์—†์ด ์†Œ์ผ“์„ ๋‹ซ์œผ๋ ค๋ฉด closesocket()ํ•จ์ˆ˜ํ˜ธ์ถœ

    int closesocket(SOCKET sock);

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

    int shutdown(SOCKET sock, int how);

    how ํŒŒ๋žŒ์œผ๋กœ๋Š” SD_SEND ๋ฅผ ๋„˜๊ฒจ ์ „์†ก์„ ์ค‘๋‹จํ•˜๋ฉฐ,

    SD_RECEIVE ๋กœ ์ˆ˜์‹ ์„ ์ค‘๋‹จํ•œ๋‹ค.

    ํ˜น์€, SD_BOTH ๋ฅผ ์จ์„œ ์†ก์ˆ˜์‹ ์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋” ์ž์„ธํžˆ๋Š” SD_SEND ๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ˜„์žฌ ์ „์†ก ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ „์†ก ๋’ค FIN ํŒจํ‚ท์„ ๋ณด๋‚ด๋Š”๋ฐ,

    ์ด๋กœ ์จ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ด์ œ ์—ฐ๊ฒฐ์„ ์•ˆ์ •ํ•˜๊ฒŒ ๋‹ซ๊ณ ์ž ํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ๋ ค์คŒ.

    ๊ทธ๋Ÿฌ๋ฉด ์ƒ๋Œ€๋ฐฉ๋„ FIN ํŒจํ‚ท์„ ์‘๋‹ตํ•˜๊ฒŒ ๋œ๋‹ค. -> ์„œ๋กœ ์ฃผ๊ณ  ๋ฐ›๊ณ  ๋‚˜๋ฉด ์†Œ์ผ“์„ ์‹ค์ œ๋กœ ๋‹ซ์•„๋„ ์•ˆ์ „ํ•˜๋‹ค.

    ์†Œ์ผ“์„ ๋‹ซ์œผ๋ฉด ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ์šด์˜์ฒด์ œ์— ๋ฐ˜๋‚ฉํ•˜๋ฉฐ, ์‚ฌ์šฉ ๋งˆ์นœ ์†Œ์ผ“์€ ๋ฐ˜๋“œ์‹œ ๋‹ซ๋„๋กํ•˜์ž!!


2. ์šด์˜์ฒด์ œ๋ณ„ API์ฐจ์ด

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์†Œ์ผ“ ๊ฐœ๋ฐœ ์‹œ ๋ฏธ๋ฆฌ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ๊ฒƒ๋“ค

  • ํ”Œ๋žซํผ๋ณ„๋กœ ์†Œ์ผ“์ž์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ž๋ฃŒํ˜•์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

    • ์œˆ10์ด๋‚˜ XBox๋“ฑ ์œˆ๋„ ๊ธฐ๋ฐ˜ ํ”Œ๋žซํผ์€ SOCKET์ด UINT_PTR์— ๋Œ€ํ•œ typedef์ธ ๋ฐ˜๋ฉด, POSIX๊ธฐ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค๋‚˜ ๋งฅos๋Š” ์†Œ์ผ“ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ int ๊ฐ’ ํ•˜๋‚˜์— ๋ถˆ๊ณผํ•˜๋‹ค. socket() ํ•จ์ˆ˜๊ฐ€ ์ •์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์—๋Š” ํฐ ๋‹จ์  ์ด ์žˆ๋Š”๋ฐ, ์ž๋ฃŒํ˜• ์•ˆ์ „์„ฑ์ด ๋งŽ์ด ๋ถ€์กฑํ•˜๋‹ค๋Š”๊ฒƒ -> ์•„๋ฌด ์ •์ˆซ๊ฐ’(5 X 4๊ฐ™์ด) ๋„ฃ์–ด๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ „ํ˜€ ์•Œ์•„์ฑ„์ง€ ๋ชปํ•œ๋‹ค.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ—ค๋” ํŒŒ์ผ์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ.

    • ์œˆ๋„์šฉ ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณดํ†ต Winsock2๋ฅผ ์‚ฌ์šฉํ•ด์„œ Winsock2.h ๋ฅผ #includeํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์ „ ๊ตฌ์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Windows.h๊ฐ€ ์ž๋™ ํฌํ•จ ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ตฌ์‹ ํ—ค๋”ํŒŒ์ผ์—์„œ ์†Œ์ผ“ ๊ธฐ๋ณธ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์„ ์ ํ•ด ๋ฒ„๋ฆฌ๋ฏ€๋กœ ์ถฉ๋Œ ๋ฐœ์ƒ ์ด๋Ÿฌํ•œ ํ˜ผ๋ž€์„ ํ”ผํ•˜๋ ค๋ฉด WIndows.h๋ฅผ ์ธํด๋ฃจ ์ „์— ๋จผ์ € WinSock2๋ฅผ ์ธํด๋ฃจ๋“œํ•˜๊ฑฐ๋‚˜, Windows.h๋ฅผ ์ธํด๋ฃจํ•˜๊ธฐ ์•ž์„œ WIN32LEANAND_MEAN ๋งคํฌ๋กœ ๋ฅผ #defineํ•ด์•ผํ•œ๋‹ค.(์ด ๋งคํฌ๋กœ ์ •์˜ํ•ด๋‘๋ฉด ์ „์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ Winsock๊ด€๋ จ ๋‚ด์šฉ ๋ฐ ๋ฌธ์ œ ์žˆ๋Š” ๋ถ€๋ถ„์„ ํฌํ•จํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.)

    • POSIX ํ”Œ๋žซํผ ์€ sys/socket.h ๋ฅผ ์ธํด๋ฃจ๋“œํ•˜์—ฌ ์“ด๋‹ค. IPv4 ์ „์šฉ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด netinet.in.h ๋ฅผ ์ธํด๋ฃจํ•ด์•ผ ํ• ๊ฒƒ. ์ฃผ์†Œ๋ณ€ํ™˜ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์‹œ arpa/inet.h ์ธํด๋ฃจ๋“œํ•˜์ž. ๋„ค์ž„ ๋ฆฌ์กธ๋ฃจ์…˜ ์‚ฌ์šฉ ์‹œ netdb.h ์ธํด๋ฃจ๋“œ

    • ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”/๋งˆ๋ฌด๋ฆฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ํ”Œ๋žซํผ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค POSIX ํ”Œ๋žซํผ์—์„  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ํ™œ์„ฑํ™” ์ƒํƒœ๋กœ, ๋”ฑํžˆ ๋ญ”๊ฐ€ ๋จผ์ € ํ•ด์ค„ ํ•„์š”๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ Winsock2๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”์™€ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค. ๋˜ํ•œ ์–ด๋Š ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ธ์ง€ ์ง€์ •ํ•ด์•ผํ•˜๋ฉฐ ์œˆ๋„ ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์„ฑํ™” ํ•˜๋ ค๋ฉด WSAStartup()ํ•จ์ˆ˜ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.

      //์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์„ฑํ™”.
      int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

      wVersionRequested ๋Š” Winsock ๊ตฌํ˜„ ๋ฒ„์ „ ์„ ํƒ์ด๋ฏ€๋กœ, ํ˜„์žฌ ๋†’์€ ๋ฒ„์ „์€ 2.2๋กœ MAKEWORD(2, 2)๋„˜๊ฒจ์ค€๋‹ค.

    lpWSAData ๋Š” ์œˆ๋„ ์ „์šฉ ๊ตฌ์กฐ์ฒด๋กœ, WSAStartup()์ด ํ™œ์„ฑํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋กœ ๊ฐ’์„ ์ฑ„์›Œ์ค€๋‹ค.(๋ฒ„์ „ ์ •๋ณด ๋“ฑ..)

    WSAStartup() ๋Š” ์„ฑ๊ณต ์‹œ 0๋ฆฌํ„ด ํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ์ฝ”๋“œ ๋ฆฌํ„ดํ•œ๋‹ค.(๋Œ€๋ถ€๋ถ„ ์—๋Ÿฌ ์ด์œ ๋Š” Winsock2ํ•จ์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•„์„œ์ด๋‹ค..)

    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์ข…๋ฃŒํ•˜๊ณ  ๋งˆ๋ฌด๋ฆฌ ํ•  ๋–„๋Š” WSACleanup() ํ˜ธ์ถœ

    int WSACleanup();

    WSACleanup() ๋Š” ํŒŒ๋žŒ๊ฐ’์ด ์—†๊ณ  ๋ฆฌํ„ด๊ฐ’์€ ์—๋Ÿฌ์ฝ”๋“œ์ด๋‹ค. ํ˜ธ์ถœ ์‹œ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๋˜ ๋ชจ๋“  ์†Œ์ผ“ ๋™์ž‘์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋˜๊ณ  ์†Œ์ผ“๋ฆฌ์†Œ์Šค๋Š” ๋ชจ๋‘ ์†Œ๋ฉธ ๋œ๋‹ค. -> Winsock์„ ๋งˆ๋ฌด๋ฆฌ ํ•  ๋–„๋Š” ๋ชจ๋“  ์†Œ์ผ“์ด ๋‹ซํ˜€์žˆ๊ณ  ์‚ฌ์šฉ์ด ๋๋‚ฌ๋Š”์ง€ ์ฒดํฌ ์ฃผ์˜! ๋˜ํ•œ WSACleanup๋Š” ๋ ˆํผ ์นด์šดํŠธ ๋˜๋ฏ€๋กœ ํ˜ธ์ถœ ํšŸ์ˆ˜๋งŒํผ WSACleanup์„ ํ˜ธ์ถœํ•ด์•ผ ์‹ค์ œ ๋งˆ๋ฌด๋ฆฌ ์ž‘์—…์ด ์ผ์–ด๋‚œ๋‹ค.

    • ํ”Œ๋žซํผ ๋งˆ๋‹ค ์—๋Ÿฌํ†ต๋ณด ๋ฐฉ์‹์ด ์ข€ ๋‹ค๋ฅธ๋ฐ, ๋Œ€๋ถ€๋ถ„ ํ•จ์ˆ˜๋Š” ์—๋Ÿฌ ์‹œ -1์„ ๋ฆฌํ„ดํ•˜๊ณ , ์œˆ๋„์—๋Š” -1 ๋Œ€์‹  SOCKET_ERROR๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋” ์ž์„ธํžˆ ์•Œ๋ ค๋ฉด Winsock2์˜ WSAGetLastError()ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.

      // ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ์ฝ”๋“œ๋งŒ ์ €์žฅํ•ด ๋‘”๋‹ค.
      // ์ฆ‰, ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฐ๊ณผ๋กœ -1 ๋ฐ›์œผ๋ฉด ์ฆ‰์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
      int WSAGetLastError();

      POSIX ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณ„๋„ ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋‘์ง€ ์•Š๊ณ  Cํ‘œ์ค€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ errno ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์—๋Ÿฌ ๊ฐ’์„ ํ™•์ธ ํ•˜๋ ค๋ฉด errno.h๋ฅผ ์ธํด๋ฃจ๋“œํ•˜์ž.


3. ์†Œ์ผ“ ์ฃผ์†Œ

๋ชจ๋“  ๋„ท์›Œํฌ ๊ณ„์ธต ํŒจํ‚ท์—๋Š” ๋ฐœ์‹ ์ง€ ์ฃผ์†Œ์™€ ๋ชฉ์ ์ง€ ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ „์†ก ๊ณ„์ธต ํŒจํ‚ท์€ ์—ฌ๊ธฐ์— ๋”ํ•ด ๋ฐœ์‹ ์ง€ ํฌํŠธ์™€ ๋ชฉ์ ์ง€ ํฌํŠธ๊ฐ€ ํ•„์š”. ์ด๋Ÿฌํ•œ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด API์— sockaddr ์ž๋ฃŒํ˜•์ด ์ •์˜๋˜์–ด์žˆ๋‹ค.__

struct sockaddr
{
    uint16_t sa_family;
    char     sa_data[14];
};
  • sa_family๋Š” ์ฃผ์†Œ์˜ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆซ๊ฐ’. ์†Œ์ผ“ ์ฃผ์†Œ๋ฅผ ์†Œ์ผ“์— ์‚ฌ์šฉํ•˜๋ ค๋ฉด sa_family ๊ฐ’์ด ์†Œ์ผ“์„ ๋งŒ๋“ค ๋–„ ์ป๋˜ afํŒŒ๋žŒ๊ณผ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค.
  • sa_data ํ•„๋“œ๋Š” ์ฃผ์†Œ ํŒจ๋ฐ€๋ฆฌ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํฌ๋งท์˜ ์ฃผ์†Œ๋ฅผ ๋‹ด์•„์•ผ ํ•˜๋ฏ€๋กœ ๋ฐ”์ดํŠธ์˜ ๋ฐฐ์—ด๋กœ๋˜์–ด ์žˆ๋‹ค.

์ด๊ฑธ ์ข€ ๋” ๋ณด์™„ํ•œ ํŒจํ‚ท ๊ตฌ์กฐ์ฒด๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹.

struct sockaddr_in
{
    short           sin_family;
    uint16_t        sin_port;
    struct  in_addr sin_addr;
    char            sin_zero[8];
};
  • sin_family ๋Š” sa_family ์™€ ๊ฐ™์€ ์œ„์น˜๋ฉฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

  • sin_addr ๋Š” 4๋ฐ”์ดํŠธ์˜ IPv4 ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ in_addr ์ž๋ฃŒํ˜•์€ ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ค. ๋ณดํ†ต ๋งˆ์นจํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๊ฐ ์ˆซ์ž๋ฅผ ๋„ค ๊ฐœ์˜ ๋ฐ”์ดํŠธ๋กœ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

struct in_addr
{
    union
    {
        struct
        {
            unit8_t s_b1, s_b2, s_b3, s_b4;
        }S_un_b;
        struct
        {
            uint16_t sw1, s_w2;
        }S_un_w;
        uint32_t S_addr;
    }S_un;
};
  • S_un ์œ ๋‹ˆ์˜จ ์ค‘ Sunb ๊ตฌ์กฐ์ฒด์˜ ๊ฐ’ sb1, sb2, sb3, sb4 ํ•„๋“œ์— ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • sin_zero ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ sockaddr_in ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ๋ฅผ sockaddr๊ณผ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ํŒจ๋”ฉ๊ฐ’์ด๋‹ค. ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด 0์œผ๋กœ ๋ชจ๋‘ ์ฑ„์›Œ์•ผ ํ•œ๋‹ค.

IP์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•  ๋–„ ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๋ฐ”์ดํŠธ๋ฅผ ๋ฌถ์–ด์„œ ์“ฐ๋ ค๋ฉด TCP/IP ์Šคํƒ๊ณผ ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ ๋ฐ”์ดํŠธ ์ˆœ์„œ ์ฒด๊ณ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅผ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ ํ•ด์•ผ ํ•œ๋‹ค. ๋‚˜์ค‘ ์ฑ•ํ„ฐ์— ํ”Œ๋žซํผ๋งˆ๋‹ค ์ˆœ์„œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ์•„๋ณด๊ฒ ์ง€๋งŒ, ์—ฌ๊ธฐ์„  ์ผ๋‹จ ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด์—์„œ ์—ฌ๋Ÿฌ ๋ฐ”์ดํŠธ๋กœ ๋œ ์ˆซ์ž๋ฅผ ํ˜ธ์ŠคํŠธ์˜ ์ˆœ์„œ๊ฐ€ ์•„๋‹Œ ๋„คํŠธ์›Œํฌ์˜ ์ˆœ์„œ ์ฒด๊ณ„๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ .

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” htons() ์™€ htonl() ํ•จ์ˆ˜ ์‚ฌ์šฉ.

//ํ˜ธ์ŠคํŠธ๋ฐ”์ดํŠธ ์ˆœ์„œ -> ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ๋ณ€ํ™˜.
//๋ถ€ํ˜ธ ์—†๋Š” 16๋น„ํŠธ ์ •์ˆ˜ ๋ฐ›๋Š”๋‹ค.
uint16_t    htons(uint16_t hostshort);
//๋ถ€ํ˜ธ ์—†๋Š” 32๋น„ํŠธ ์ •์ˆ˜ ๋ฐ›๋Š”๋‹ค.
uint32_t    htonl(uint32_t hostlong);

์ฐธ๊ณ ๋กœ ํ˜ธ์ŠคํŠธ ์ˆœ์„œ์™€ ๋„คํŠธ์›Œํฌ ์ˆœ์„œ๊ฐ€ ๊ฐ™์€ ํ”Œ๋žซํผ ์—์„œ๋Š” ์ด๋“ค ํ•จ์ˆ˜๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. -> ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์ง€ํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ž์ฒด๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ ๋ฐ”์ดํŠธ ์ˆœ์„œ๊ฐ€ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์— sockaddr_in ๊ตฌ์กฐ์ฒด์˜ sa_port ํ•„๋“œ ๊ฐ’์ด ์›๋ž˜ ์ง€์ •ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ฐ’์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ, ์ด๋Š” ๋ฐ”์ดํŠธ ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžŒ์ฑ„ ์‹ญ์ง„์ˆ˜๋กœ ๋ณด์ด๊ธฐ ๋–„๋ฌธ์ด๋ฏ€๋กœ ํ˜ผ๋ˆ ํ•˜์ง€ ๋ง์ž.

ํŒจํ‚ท ์ˆ˜์‹ ํ•˜๋Š” ๋“ฑ ๋ช‡๋ช‡ ๊ฒฝ์šฐ์—”, ์ฆ‰, sockaddr_in ๊ตฌ์กฐ์ฒด ๋‚ด์šฉ์„ ์ฑ„์›Œ ์ฃผ๋Š” ๊ฒฝ์šฐ ๋ฐ›์€ ์‹œ์ ์— sockaddr_in ์˜ ๊ฐ ํ•„๋“œ๋Š” ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๋‹ค์‹œ ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ๋ณ€ํ™˜ํ•ด์•ผํ•œ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ntohs() ์™€ ntohl() ํ•จ์ˆ˜ ์‚ฌ์šฉ.( htons(), htonl() ํ•จ์ˆ˜์™€ ๋ฐ˜๋Œ€๋กœ ์ž‘๋™. )

uint16_t ntohs(uint16_t networkshort);
uint32_t ntohl(uint32_t networklong);

์†Œ์ผ“ ์ฃผ์†Œ ๋งŒ๋“ค๊ณ  IP์ฃผ์†Œ ์ง€์ •ํ•˜๋Š” ์งค๋ง‰ํ•œ ์˜ˆ์ œ.

//IP ์ฃผ์†Œ๋Š” 65.254.248.180, ํฌํŠธ๋Š” 80๋ฒˆ
sockaddr_in myAddr;
memset(myAddr.sin_zero, 0, sizeof(myAddr.sin_zero));
myAddr.sin_family = AF_INET;
myAddr.sin_port = htons(80);    //ํฌํŠธ ๋ฒˆํ˜ธ ๋ณ€ํ™˜.
myAddr.sin_addr.S_un.S_un_b.s_b1 = 65;
myAddr.sin_addr.S_un.S_un_b.s_b2 = 254;
myAddr.sin_addr.S_un.S_un_b.s_b3 = 248;
myAddr.sin_addr.S_un.S_un_b.s_b4 = 180;

3.1 ์ž๋ฃŒํ˜• ์•ˆ์ •์„ฑ

์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•ˆ์ •์„ฑ์— ๋Œ€ํ•ด์„œ ์ฒจ๋ถ€ํ„ฐ ๊ณ ๋ฏผ ์—†์ด ๊ตฌํ˜„๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ ๋ฐ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ ํ˜•ํƒœ๋กœ ๊ฐ์‹ธ(wrapping) ๊ตฌํ˜„ํ•ด ๋‘๋ฉด ์œ ์šฉํ•˜๋‹ค. ๋˜ํ•œ ํŠน์ • ์†Œ์ผ“ API์— ๊ณ ์ฐฉ๋˜์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ๋‹ค๋ฅธ ๋„ท์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž‘ ๊ต์ฒด ํ•  ๋–„ ์œ ์šฉํ•˜๋‹ค.

class SocketAddress
{
public:
    //๊ธฐ๋ณธ inAddress, inPort๋ฅผ ๋ฐ›๋Š” ์†Œ์ผ“ ์ƒ์„ฑ ์ดˆ๊ธฐํ™”.
    SocketAddress(uint32_t inAddress, uint16_t inPort)
    {
        GetAsSockAddrIn()->sin_family = AF_INET;    //๊ธฐ๋ณธ์œผ๋กœ IPv4 ์ง€์ •
        GetAsSockAddrIn()->sin_addr.S_un.S_addr = htonl(inAddress);
        GetAsSockAddrIn()->sin_prot = htons(inPort);
    }

    //sockaddr ๋ฐ›์•˜๋Š”๋ฐ SocketAddress๋žฉํ•‘ ํ•˜๊ณ  ์‹ถ์„ ๋–„ ์ด์šฉํ•  ์ƒ์„ฑ์ž.
    SocketAddress(const sockaddr& inSockAddr)
    {
        memcpy(&mSockAddr, &inSockAddr, sizeof(sockaddr));
    }

    size_t GetSize() const { return sizeof(sockaddr); }

private:
    sockaddr mSockAddr;

    sockaddr_in* GetAsSockAddrIn()
    {
        return reinterpret_cast<sockaddr_in*>(&mSockAddr);
    }
};

//shared_ptr ์„ ์–ธํ•ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณต์œ ํ•˜๋ฉฐ ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํ„ฐ ๊ด€๋ฆฌ.
using SocketAddressPtr = shared_ptr<SocketAddress>;

3.2 ๋ฌธ์ž์—ด๋กœ sockaddr ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

IP ์ฃผ์†Œ์™€ ํฌํŠธ๊ฐ’์„ ์ผ์ผํžˆ ์ฑ„์šฐ๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์„ค์ • ํŒŒ์ผ๋“ฑ์—์„œ ๋ฌธ์ž์—ด๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š”๋ฐ ๋ฌผ๋ก  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์œˆ๋„์—์„  inetPton()ํ•จ์ˆ˜๋ฅผ ์“ฐ๊ณ  POSIX๊ณ„์—ด์€ inet_pton() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

  • ๋ฌธ์ž์—ด์„ IP์ฃผ์†Œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ

    //@param af = ํŒจ๋ฐ€๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณดํ†ต AF_INET์ด๋‚˜ AF_INET6์ง€์ •
    //@param src = ๋ฌธ์ž์—ด๋กœ๋œ IP ์ฃผ์†Œ
    //@param dst = ๋ณ€ํ™˜๋œ sin_addr์ฃผ์†Œ ํ•„๋“œ์˜ ํฌ์ธํ„ฐ
    int inet_pton(int af, const char* src, void* dst);
    int InetPton(int af, const char* src, void* dst);
    // ์„ฑ๊ณต์‹œ 1, ๋ฌธ์ž์—ด ํ•ด์„ ์˜ค๋ฅ˜์‹œ 0, ์‹œ์Šคํ…œ ์—๋Ÿฌ ์‹œ -1๋ฆฌํ„ด

    ์ดˆ๊ธฐํ™” ์˜ˆ์ œ.

    sockaddr_in myAddr;
    myAddr.sin_family = AF_INET;
    myAddr.sin_port = htons(80);
    InetPton(AF_Inet, "65.254.248.180", &myAddr.sin_addr);

DNS(query)๋ฅผ ์ˆ˜ํ–‰ํ•ด ๋„๋ฉ”์ธ ๋„ค์ž„์„ IP์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด. getaddrinfo() ํ•จ์ˆ˜ ์‚ฌ์šฉ.

  • ๋„๋ฉ”์ธ ์—์ž„ IP์ฃผ์†Œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ

    int getaddrinfo(const char* hostname, const char* servname, const addrinfo* hints, addrinfo** res);

    hostname์€ ๋„๋ฉ”์ธ ์กฐํšŒ๋ฅผ ํ•  ์ด๋ฆ„ ๋ฌธ์ž์—ด(ex. โ€œlive-shore.herokuiapp.comโ€) servname์—” ํฌํŠธ ๋ฒˆํ˜ธ ๋˜๋Š” ์„œ๋น„์Šค ์ด๋ฆ„์„ hints์—” ํ˜ธ์ถœ์ž๊ฐ€ ์–ด๋–ค ์ •๋ณด๋ฅผ ๋ฐ›๊ณ  ์‹ถ์€์ง€๋ฅผ ๊ธฐ์žฌํ•ด ๋‘” addrinfo ๊ตฌ์กฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ๋„˜๊ธด๋‹ค. ๊ทธ๋ƒฅ ๋ชจ๋“  ๊ฒฐ๊ณผ ๋ฐ›์œผ๋ ค๋ฉด nullptr๋„˜๊ธฐ๋ฉด ๋จ. ๊ฒฐ๊ณผ๋Š” res๋กœ ์ง€์ •ํ•œ ํฌ์ธํ„ฐ ์ฃผ์†Œ๋กœ ๋ฐ˜ํ™˜. ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ์ธ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜๋˜๋ฉฐ res๋Š” ๊ทธ ์ฒซ์จฐ ์›์†Œ๊ฐ€ ๋œ๋‹ค.

    struct addrinfo
    {
        int     ai_flags;           
        int     ai_family;
        int     ai_socktype;
        int     ai_protocol;
        size_t  ai_addrlen;     //ai_addr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” sockaddr์˜ ๊ธธ์ด.
        char*   ai_canon_name;  //๋ฆฌ์กธ๋ธŒ๋œ ํ˜ธ์ŠคํŠธ๋ช…์˜ ๋Œ€ํ‘œ์ด๋ฆ„.
        sockaddr* ai_addr;      //sockaddr์„ ๋‹ด๋Š”๋‹ค.
        addrinfo* ai_next;      //์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ƒ ๋‹ค์Œ addrinfo์ •๋ณด. ๋งˆ์ง€๋ง‰์ผ ์‹œ nullptr.
    }

    ์—ฌ๊ธฐ์„œ ์ฃผ์˜์ ์€ getaddrinfo() ๊ฐ€ addrinfo๊ตฌ์กฐ์ฒด ๋ฐ˜ํ™˜ํ•  ๋–„, ์ž์ œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹นํ•˜๋ฏ€๋กœ, ๋ฐ˜ํ™˜๋œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋‚ด์šฉ ๋‹ค ์‚ฌ์šฉ ํ›„ ํ˜ธ์ถœ์ž๊ฐ€ ์ง์ ‘ freeaddrinfo()๋ฅผ ํ˜ธ์ถœํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

    ์ด๋–„, ๋ฐ˜๋“œ์‹œ ai์— getaddrinfo()์—์„œ ๋ฐ›์€ ๋งจ ์ฒซ ๋ฒˆ์จฐ addrinfo๋ฅผ ๋„˜๊ฒจ์•ผํ•œ๋‹ค. -> ์ž์ฒด ์ˆœํšŒํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œํ•จ์œผ๋กœ.

    void freeaddrinfo(addrinfo* ai);
    • ๋‚ด๋ถ€ ๋Œ€๋žต์ ์ธ ํ”„๋กœ์„ธ์Šค๋Š”

    ํ˜ธ์ŠคํŠธ ๋„ค์ž„์„ IP์ฃผ์†Œ๋กœ ๋ฆฌ์กธ๋ธŒ(resolve) ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด, getaddrinfo() ํ•จ์ˆ˜๋Š” ์šด์˜์ฒด์ œ์— ์„ค์ •๋œ ๋Œ€๋กœ DNS ํ”„๋กœํ† ์ฝœ ํŒจํ‚ท ๋งŒ๋“  ๋’ค UDP๋‚˜ TCP๋กœ DNS ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค. ์ดํ›„ ์‘๋‹ต ๋Œ€๊ธฐ ํ›„ ํŒŒ์‹ฑํ•ด์„œ addrinfo ๊ตฌ์กฐ์ฒด์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํ˜ธ์ถœ์ž์—๊ฒŒ ๋Œ๋ ค์ค€๋‹ค.

    ์ด ๊ณผ์ •์—์„œ ํ˜ธ์ŠคํŠธ ์ •๋ณด๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›์œผ๋ฏ€๋กœ ์‹œ๊ฐ„์ด ์ง€์ฒด ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ getaddrinfo() ๋Š” ๋น„๋™๊ธฐ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ์˜ต์…˜์ด ์—†์–ด ํ˜ธ์ถœ ์Šค๋ ˆ๋“ ๋Š ์‘๋‹ต ๋ฐ›์„ ๋•Œ ๊นŒ์ง€ ๋งˆ๋ƒฅ ๋ธ”๋กœํ‚น ๋˜์•ผํ•œ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ข‹์ง€ ์•Š์œผ๋ฏ€๋กœ -> ํ•ด๊ฒฐ์ฑ…์œผ๋กœ๋Š” IP์ฃผ์†Œ ๋ฆฌ์กธ๋ธŒ ํ•  ์ผ์ด ์žˆ๋‹ค๋ฉด ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋Œ๋ฆฌ๋Š” ๋ฐฉ์•ˆ ์„ ๋ชจ์ƒ‰ํ•ด์•ผํ•จ.

    -> GetAddrInfoEx() ์œˆ๋„์—์„œ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋ณ„๋„ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒํ•˜๋Š” ์˜ต์…˜์ด ์žˆ๋‹ค.

    ์˜ˆ์ œ ์ž‘์„ฑ... 107์ชฝ

3.3 ์†Œ์ผ“ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ

์šด์˜์ฒด์ œ๊ฐ€ ์–ด๋–ค ์†Œ์ผ“์ด ํŠน์ • ์ฃผ์†Œ์™€ ์ „์†ก ๊ณ„์ธต ํฌํŠธ๋ฅผ ์“ฐ๊ฒ ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์ ˆ์ฐจ๋ฅผ ๋ฐ”์ธ๋”ฉ ์ด๋ผ๊ณ  ์ผ์ปฌ๋Š”๋‹ค.

int bind(SOCKET sock, const sockaddr* address, int address_len);

sock ์€ ๋ฐ”์ธ๋”ฉํ•  ์†Œ์ผ“์œผ๋กœ, ์•ž์„œ ๋งŒ๋“  socket()์˜ ๊ฐ์ฒด

address ๋Š” ์†Œ์ผ“์„ ๋ฐ”์ธ๋”ฉํ•  ์ฃผ์†Œ. - ํšŒ์‹  ์ฃผ์†Œ๋ฅผ ๋ฐํ˜€ ๋‘๊ธฐ ์œˆํ•œ ๊ฒƒ. ๋˜ํ•œ, ์–ด๋Š ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๋ช…์‹œ ๊ฐ€๋Šฅ.

address_len ์€ sockaddr์˜ ๊ธธ์ด.

์„ฑ๊ณต์‹œ 0, ์‹คํŒจ ์‹œ -1๋ฆฌํ„ด.

  • ์†Œ์ผ“ ๋ฐ”์ธ๋”ฉ์˜ ์˜๋ฏธ

    1. ์šด์˜์ฒด์ œ๊ฐ€ ์ด ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ๋ชฉ์ ์ง€๋กœ ๋ฐœ์‹ ๋œ ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•˜๋ฉด ์šด์˜์ฒด์ œ๋Š” ์ด์ œ ์ด ์†Œ์ผ“์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
    2. bind() ์—์„œ ์ง€์ •ํ•œ ์ฃผ์†Œ ๋ฐ ํฌํŠธ๋ฅผ ์ด ์†Œ์ผ“์„ ํ†ตํ•ด ๋‚˜๊ฐ€๋Š” ํŒจํ‚ท์˜ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต๊ณผ ์ „์†ก ๊ณ„์ธต ํ•ด๋”์˜ ๋ฐœ์‹  ์ฃผ์†Œ์™€ ํฌํŠธ๋กœ ์šด์˜์ฒด์ œ๊ฐ€ ์“ฐ๊ฒŒ ๋œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์†Œ์™€ ํฌํŠธ ์Œ ํ•˜๋‚˜๋‹น ํ•˜๋‚˜์˜ ์†Œ์ผ“๋งŒ ๋ฐ”์ธ๋”ฉ ๊ฐ€๋Šฅ. ์ด๋ฏธ ์‚ฌ์šฉ์ค‘์ธ ๊ฑฐ ๋ฐ”์ธ๋”ฉ ํ•  ์‹œ ์—๋Ÿฌ ๋ฆฌํ„ด. ์ด ๊ฒฝ์šฐ ์•„์ง ์‚ฌ์šฉ ์ค‘์ด์ง€ ์•Š์€ ํฌํŠธ๋ฅผ ์ฐพ์„ ๋–„ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด ๋ฐ”์ธ๋”ฉ ์‹œ๋„ ํ•ด์•ผํ•˜๋Š”๋ฐ. bind() ํ˜ธ์ถœ ์‹œ ํฌํŠธ์— 0์ง€ ์ •ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์‚ฌ์šฉ ์ค‘์ด์ง€ ์•Š์€ ํฌํŠธ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ๋ฐ”์ธ๋”ฉ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก ๋ฐ ์ˆ˜์‹  ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์†ค์„ธ์ด ๋ฐ”์ธ๋”ฉ ๋˜์–ด์•ผ ํ•œ๋‹ค!! ๋งŒ์ธ ๋ฐ”์ธ๋”ฉ ๋˜์ง€ ์•Š์€ ์†Œ์ผ“์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๋ ค ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž๋™์œผ๋กœ ๋‚จ์€ ํฌํŠธ์— ๋ฐ”์ธ๋”ฉ ํ•ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ํ™•์‹คํžˆ ๊ณ ์ • ์•„๋‹ˆ๋ผ๋ฉด ๊ตณ์ด ๋ฐ”์ธ๋”ฉ ํ•  ํ•„์š”๋Š” ์—†๋‹ค. (๊ทธ๋ž˜๋„ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ฃผ๋Š”๊ฒŒ ๋‚ซ์ง€ ์•Š์„๊นŒ..)


4 UDP ์†Œ์ผ“

  • ๋ฐ์ดํ„ฐ ์†ก์‹ 

    UDP ์†Œ์ผ“์€ ๋งŒ๋“  ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด ๋„ท์›Œํฌ ๋ชจ๋“ˆ์ด ๋™์ ํฌํŠธ ๋ฒ”์œ„์— ๋‚จ์•„ ์žˆ๋Š” ํฌํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•ด์ค€๋‹ค. sendto() ํ•จ์ˆ˜ ์ด์šฉ.

    int sendto(SOCKET sock, const char* buf, int len, int flags, const sockaddr* to, int tolen);

    sock ๋Š” ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ๋ณด๋‚ผ ์†Œ์ผ“. ๋ฐ”์ธ๋”ฉํ•œ ์ฃผ์†Œ์™€ ํฌํŠธ๋Š” ์™ธ๋ถ€๋กœ ๋‚˜๊ฐ€๋Š” ํŒจํ‚ท ํ—ค๋”์˜ ๋ฐœ์‹ ์ž ์ฃผ์†Œ๊ฐ€ ๋œ๋‹ค.

    buf ๋Š” ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๋ฉฐ, ๊ผญ charํ˜• ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฑด ์•„๋‹ˆ๋‹ค. char๋กœ ์บ์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ๋”ฐ๋ฉด ์–ด๋–ค ๊ฒƒ์ด๋“  ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

    len ์€ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด. ํŒจํ‚ท ์ตœ๋Œ€ ๊ธธ์ด๋Š” ใ„น์ดํฌ ๊ณ„์ธต์˜ MTU๋กœ ๊ฒฐ์ •๋˜๋Š”๋ฐ ์ด๋”๋„ท์˜ MTU๋Š” 1,500๋ฐ”์ดํŠธ ์ด๋‹ค. ๊ทผ๋ฐ ์ด ์กฐ์ฐจ ์—ฌ๋Ÿฌ ๊ณ„์ธต์˜ ํ—ค๋”์™€ ์—ฌํƒ€ ํŒจํ‚ท ๋ž˜ํผ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ถ„์—ด์„ ํ”ผํ•˜๋ ค๋ฉด 1,300๋ฐ”์ดํŠธ ๋‚ด๋กœ ํ•ด์•ผํ•œ๋‹ค๋Š”๊ฑธ ๋ช…์‹ฌ!!

    flags ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ œ์–ดํ•˜๋Š” ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ. ๋Œ€๋ถ€๋ถ„ ๊ฒŒ์ž„ ์ฝ”๋“œ์—์„  0์œผ๋กœ ๋‘”๋‹ค.

    to ๋Š” ์ˆ˜์‹ ์ž์˜ ๋ชฉ์ ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” sockaddr์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์†Œ ํŒจ๋ฐ€๋ฆฌ๋Š” ์†Œ์ผ“์„ ๋งŒ๋“ค ๋–„ ์ง€์ •ํ•œ ์ฃผ์†Œ ํŒจ๋ฐ€๋ฆฌ์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ์ด ์ธ์ž์— ์„ค์ •ํ•œ ์ฃผ์†Œ์™€ ํฌํŠธ๊ฐ€ IP ํ—ค๋”์™€ UDP ํ—ค๋”๋กœ ๋ณต์‚ฌ๋˜์–ด ํŒจํ‚ท์˜ IP ์ฃผ์†Œ ๋ฐ UDP ํฌํŠธ๊ฐ€ ๋œ๋‹ค.

    tolen ์€ sockaddr์˜ ๊ธธ์ด๋ฅผ ์ง€์ •ํ•œ๋‹ค. IPv4์—์„  ๊ทธ๋ƒฅ sizeof(sockaddr_in)์„ ๋„ฃ์–ด์ค€๋‹ค.

    ๋™์ž‘ ์„ฑ๊ณต์‹œ ์†ก์‹  ๋Œ€๊ธฐ์—ด์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ์ด์™ธ์˜ ๊ฒฝ์šฐ๋Š” -1์„ ๋ฆฌํ„ดํ•œ๋‹ค. ์–‘์ˆ˜ ๊ฐ’ ๋ง‰ ๋ฆฌํ„ด ๋˜์—ˆ๋‹ค๊ณ  ์ „์†ก ์™„๋ฃŒ๋œ๊ฑด ์•„๋‹ˆ๊ตฌ ๋„คํŠธ์›Œํฌ ๋ชจ๋“ˆ์˜ ์ „์†ก ๋Œ€๊ธฐ์—ด์— ๋ง‰ ๋“ฑ๋ก๋˜์—ˆ๋‹ค๋Š” ์ •๋„๋กœ ์ดํ•ด.

  • ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 

    ๋ณ„๋‹ค๋ฅธ ์ •์ฐจ ์—†์ด recvfrom() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ.

    int recvfrom(SOCKET sock, char* buf, int len, int flags, sockaddr* from, int* fromlen);

    sock ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ ค๋Š” ์†Œ์ผ“. ๋ณ„๋‹ฌ๋Š ์˜ต์…˜ ์„ค์ • ์—†๋Š” ๊ฒฝ์šฐ, ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์ด ์—†์œผ๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น๋˜์–ด ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ์ˆ˜์‹ ํ•  ๋–„๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

    buf ๋Š” ์ˆ˜์‹ ํ•œ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ๋ณต์‚ฌํ•ด ๋„ฃ์„ ๋ฒ„ํผ์ด๋‹ค.

    len ์€ buf ์ธ์ž๊ฐ€ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ”์ดํŠธ ๊ธธ์ด๋ฅผ ์ง€์ •. ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์ •ํ•œ ์ˆซ์ž ์ด์ƒ์˜ ๋ฐ”์ดํŠธ๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋„‰๋„‰ํžˆ ์žก๋„๋ก.

    flag ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์‹ ์„ ์ œ์–ดํ•˜๋Š” ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ. ๋Œ€๋ถ€๋ถ„ ๊ฒŒ์ž„์—์„  0์ด๋ฉด ์ถฉ๋ถ„.

    from ์€ sockaddr ๊ตฌ์กฐ์ฒด์˜ ํฌ์ธํ„ฐ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ๋ฐœ์‹ ์ž์˜ ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ์ฑ„์›Œ์ค„ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด๋Š” ๋‹จ์ง€ ์–ด๋Š ๋ฐœ์‹ ์ž๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์šฉ๋„.

    fromlen ์€ ์œ„์˜ from ์ธ์ž์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค„ ์ •์ˆ˜ ํฌ์ธํ„ฐ. from์ด ์•ˆ์ฑ„์›Œ์ง€๋ฉด ์ด ๋˜ํ•œ ์ฑ„์›Œ์ง€์ง€ ์•Š๋Š”๋‹ค.

    ๋™์ž‘ ์„ฑ๊ณต์‹œ buf์— ๋ณต์‚ฌํ•œ ๋ฐ”์ดํŠธ์˜ ๊ธธ์ด๋ฅผ ๋ฆฌํ„ด, ์—๋Ÿฌ ์‹œ -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

4.1 ์ž๋ฃŒํ˜• ์•ˆ์ „์„ฑ์„ ๋ณด๊ฐ•ํ•œ UDP ์†Œ์ผ“

UDPSocket ํด๋ž˜์Šค ๊ตฌํ˜„ - ์ฃผ์†Œ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ์†ก์ˆ˜์‹  ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„.(111ํŽ˜์ด์ง€)

ใ…ใ„ดใ…‡


5 TCP ์†Œ์ผ“

UDP๋Š” ๋‚ด๋ถ€ ์ƒํƒœ ์—†๊ณ  ์—ฐ๊ฒฐ ์œ ์ง€X, ์‹ ๋ขฐ์„ฑ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธ์ŠคํŠธ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์†Œ์ผ“๋งŒ ์žˆ์œผ๋ฉด ๋จ. ๋ฐ˜๋ฉด, TCP๋Š” ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋‘ ํ˜ธ์ŠคํŠธ ์‚ฌ์ด์— ์—ฐ๊ฒฐ์„ ๋งบ์–ด์•ผ ํ•˜๋ฉฐ ๋˜ํ•œ ๋ˆ„๋ฝ๋œ ํŒจํ‚ท์„ ์žฌ์ „์†ก ํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ ํ•ด์•ผํ•œ๋‹ค. ๋ฒ„ํด๋ฆฌ ์†Œ์ผ“ API์—์„  socket ์ž์ฒด์— ๊ทธ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ์ด๋Š” ๊ณง, ํ˜ธ์ŠคํŠธ๊ฐ€ ๊ฐ TCP ์—ฐ๊ฒฐ๋งˆ๋‹ค ๋ณ„๊ฐœ์˜ ๋…์ž์  ์†Œ์ผ“์„ ํ•˜๋‚˜์”ฉ ์œ ์ง€ํ•œ๋‹ค๋Š” ๋œป.

  • TCP์—์„œ ํด๋ผ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ์—ฐ๊ฒฐ์„ ์ดˆ๊ธฐ ์ˆ˜๋ฆฝํ•˜๋ ค๋ฉด 3-์›จ์ด ํ•ธ๋“œ์…ฐ์ดํ‚น ์„ ๊ฑฐ์ณ์•ผํ•œ๋‹ค.

    1. ์ฒซ๋‹จ๊ณ„ ๋Š” ๋งŒ๋“ค์–ด๋‘” ์†Œ์ผ“์— ํŠน์ • ํฌํŠธ ๋ฐ”์ธ๋”ฉ ํ•œ ๋’ค ๋“ค์–ด์˜ค๋Š” ํ•ธ๋“œ์…ฐ์ดํ‚น์„ ๋ฆฌ์Šค๋‹ ํ•ด์•ผํ•œ๋‹ค.

      socket() ๋งŒ๋“ค๊ณ  bind() ๋ฐ”์ธ๋”ฉ ํ›„, listen()์œผ๋กœ ๋ฆฌ์Šค๋‹์„ ์‹œ์ž‘ํ•œ๋‹ค.

      int listen(SOCKET sock, int backlog);

      sock ์€ ๋ฆฌ์Šค๋‹ ๋ชจ๋“œ์— ๋‘˜ ์†Œ์ผ“. ์†Œ์ผ“์ด ๋ฆฌ์Šค๋‹ ๋ชจ๋“œ์— ์žˆ์œผ๋ฉด์™ธ๋ถ€์—์„œ ์˜ค๋Š” TCPํ•ธ๋“œ์…ฐ์ดํ‚น ์ฒซ ๋‹จ๊ณ„ ์—ฌ์ฒญ์„ ๋ฐ›์•„ ๋Œ€๊ธฐ์—ด์— ์ €์žฅํ•ด ๋‘”๋‹ค. ๊ทธ ๋’ค accept()ํ˜ธ์ถœ ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ ํ•ธ๋“œ์…ฐ์ดํ‚น ๋‹จ๊ณ„ ์†ํ–‰.

      backlog ๋Š” ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์„ ๋Œ€๊ธฐ์—ด์— ๋‘˜ ์ตœ๋Œ€ ์ˆซ์ž๋ฅผ ์ง€์ •. ๊ฐ€๋“์ฐจ๋ฉด ๊ทธ ์ดํ›„์— ๋“ค์–ด์˜ค๋ ค๋Š” ์—ฐ๊ฒฐ์€ ๋Š๊ธด๋‹ค. ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ ์‹œ SOMAXCONN ์„ ๋„ฃ์–ด์ฃผ์ž.

      ์„ฑ๊ณต ์‹œ 0, ์—๋Ÿฌ ์‹œ -1์„ ๋ฆฌํ„ดํ•œ๋‹ค.

    2. ๋“ค์–ด์˜ค๋Š” ์—ฐ๊ฒฐ์„ ๋ฐ›์•„ ๊ณ„์† TCPํ•ธ๋“œ์…ฐ์ดํ‚น ์ง„ํ–‰ํ•˜๋ ค๋ฉด accept() ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

      SOCKET accept(SOCKET sock, sockaddr* addr, int* addrlen);

      sock ์€ ๋ฆฌ์Šค๋‹ ๋ชจ๋“œ์˜ ์†Œ์ผ“์œผ๋กœ, ์—ฌ๊ธฐ์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

      addr ์€ accept() ํ•จ์ˆ˜๊ฐ€ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๋Š” ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์˜ ์ฃผ์†Œ๋ฅผ ์ฑ„์›Œ์ค„ sockaddr ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ.(๊ทธ์ € ์ฃผ์†Œ๋ฅผ ๋ฐ›๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ.)

      addrlen ์€ addr ๋ฒ„ํผ์˜ ํฌ์ธํ„ฐ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ. ์ด ๋˜ํ•œ addr ๋‚ด์šฉ์ด ์ฑ„์›Œ์งˆ ๋–„ ๊ฐ’์ด ์ฑ„์›Œ์ง„๋‹ค.

      ํ•จ์ˆ˜๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒˆ ์†Œ์ผ“์ด ๋งŒ๋“ค์–ด์ ธ ๋ฆฌํ„ด ๋˜๋ฉฐ ์ด ์†Œ์ผ“์€ ์ดํ›„ ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์™€ ํ†ต์‹ ํ•˜๋Š” ์šฉ๋„๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ ์†Œ์ผ“์€ ๋ฆฌ์Šค๋‹ ์†Œ์ผ“๊ณผ ๊ฐ™์€ ํฌํŠธ์— ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค. TCP๋Š” ์—ฐ๊ฒฐ๋œ ๊ฐ ์›๊ฒฉ ํ˜ธ์ŠคํŠธ ๋งˆ๋‹ค ์†Œ์ผ“์„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ธฐ์–ตํ•ด๋‘์ž!!

      ๋ฆฌํ„ด ๋œ ์ƒˆ ์†Œ์ผ“์€ ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์— ๋Œ€์‘๋˜๋ฉฐ, ์›๊ฒฉํ˜ธ์ŠคํŠธ์˜ ์ฃผ์†Œ์™€ ํฌํŠธ๊ฐ€ ๊ธฐ๋ก๋˜๊ณ  ์ด ํ˜ธ์ŠคํŠธ๋กœ ๋ณด๋‚ด๋Š” ํŒจํ‚ท ์ „๋ถ€๊ฐ€ ์ €์žฅ๋˜์–ด ๋‚˜์ค‘์— ๋ˆ„๋ฝ์ด ๋ฐœ์ƒํ•ด๋„ ์žฌ์ „์†ก ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

    3. ์„œ๋ฒ„๋Š” listen() ์ƒํƒœ์—์„œ accept() ๋ฅผ ํ˜ธ์ถœํ•ด ์ ‘์†์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜์ง€๋งŒ ํด๋ผ ๋Š” ์ผ๋Œ€์ผ ๋Œ€์นญ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์†Œ์ผ“๋งŒ๋“  ํ›„ connect() ๋งŒ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐ”๋กœ ํ•ด๋‹น ์›๊ฒฉ ์„œ๋ฒ„์— ์ ‘์†ํ•ด ํ•ธ๋“œ์…ฐ์ดํ‚น ์ ˆ์ฐจ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

      int connect(SOCKET sock, const sockaddr* addr, int addrlen);

      sock ์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์†Œ์ผ“

      addr ์—ฐ๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์›๊ฒฉ ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

      addrlen addr ์ธ์ž์˜ ๊ธธ์ด

      ์„ฑ๊ณต ์‹œ 0 ๋ฆฌํ„ด, ์—๋Ÿฌ ์‹œ -1 ๋ฆฌํ„ด

      connect() ํ˜ธ์ถœํ•˜๋ฉด ์ตœ์ดˆ SYNํŒจํ‚ท์„ ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ์— ์ „์†กํ•ด TCP ํ•ธ๋“œ์…ฐ์ดํ‚น์„ ๊ฐœ์‹œ. ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์— ํ•ด๋‹น ํฌํŠธ๋กœ ๋ฐ”์ธ๋”ฉํ•œ ๋ฆฌ์Šค๋‹ ๋ชจ๋“œ ์†Œ์ผ“์ด ์žˆ๋Š”๊ฒฝ์šฐ, ์„œ๋ฒ„ ์›๊ฒฉ ํ˜ธ์ŠคํŠธ๋Š” accept() ํ˜ธ์ถœํ•ด ์ด ํ•ธ๋“œ์…ฐ์ดํ‚น์„ ์ฒ˜๋ฆฌ. ๋ณ„๋‹ค๋ฅธ ์˜ต์…˜ ์ง€์ • ์•ˆํ•˜๋ฉด connect()ํ˜ธ์ถœ ์‹œ ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๋Š” ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฝ๋˜๊ฑฐ๋‚˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋  ๋–„ ๊นŒ์ง€ ๋ธ”๋กœํ‚น ๋œ๋‹ค.

5.1 ์—ฐ๊ฒฐ๋œ ์†Œ์ผ“์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ณ  ๋ฐ›๊ธฐ

  • ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ

    ์—ฐ๊ฒฐ๋œ TCP ์†Œ์ผ“์€ ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์˜ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ๊ฐ„์งํ•˜๋ฏ€๋กœ ๋•๋ถ„์— ๋งค ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์ฃผ์†Œ ์ •๋ณด๋ฅผ ์ผ์ผ์ด ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์ „์†ก ํ• ๋–„๋Š” sendto() ๋Œ€์‹  sned() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ.

    int send(SOCKET sock, const char* buf, int len, int flags);

    sock ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š”๋ฐ ์‚ฌ์šฉํ•  ์†Œ์ผ“.

    buf ๋Š” ์ŠคํŠธ๋ฆผ์— ๊ธฐ๋กํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธด ๋ฒ„ํผ. UDP์™€ ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ฉฐ ํ•œ ๋ฒˆ์— ์ „์†ก๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋‹ค. ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋Š” ์†Œ์ผ“ ์™ธ๋ถ€ ์ „์†ก์š” ๋ฒ„ํผ์— ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค๊ฐ€ ์ ๋‹นํ•œ ์‹œ๊ธฐ์— ์ „์†ก๋œ๋‹ค.

    len ์ „์†กํ•  ๋ฐ์ดํ„ฐ์˜ ๋ฐ”์ดํŠธ ์ˆ˜. UDP์™€ ๋‹ฌ๋ฆฌ ๋งํฌ ๊ณ„์ธต์˜ MTU๋ณด๋‹ค ์ž‘๊ฒŒ ์žก์„ ํ•„์š” ์—†๊ณ , ์†Œ์ผ“์˜ ์ „์†ก ๋ฒ„ํผ์— ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š” ํ•œ ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๋ณด๋‘ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.(์ ๋‹นํ•œ ํฌ๊ธฐ๋กœ ์ž˜๋ผ์„œ ๋ณด๋‚ด๊ฒŒ ๋  ๊ฒƒ.)

    flags ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ œ์–ดํ•˜๋Š” ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ ๋Œ€๊ฐœ ๊ฒŒ์ž„์—์„œ๋Š” 0์œผ๋กœ ์„ค์ •.

    ํ•จ์ˆ˜ ํ˜ธ์ถœ ์„ฑ๊ณต์‹œ ์ „์†กํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. -> ์ด ๊ฐ’์ด len์— ์ง€์ •ํ•œ ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์†Œ์ผ“ ์ „์†ก ๋ฒ„ํผ๊ฐ€ ์ „๋ถ€ ๋ณด๋‚ด๊ธฐ์—๋Š” ๋ชจ์ž๋ผ์„œ ์—ฌ์œ  ๊ณต๊ฐ„๋งŒํผ ์ž˜๋ผ ๋ณด๋ƒˆ๋‹ค๋Š” ๋œป ๊ณต๊ฐ„์ด ์•„์˜ˆ ์—†๋‹ค๋ฉด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๋Š” ๋ธ”๋กœํ‚น๋˜ ๊ณ„์† ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๋ฉด -1์„ ๋ฆฌํ„ดํ•œ๋‹ค. ์•„์ฐธ ์–‘์ˆ˜๋ฆฌํ„ด๋˜์—ˆ๋‹ค๊ณ  ์ „์†ก ์™„๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ผ ์ „์†ก ๋Œ€๊ธฐ์—ด์— ๋“ฑ๋ก๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์ดํ•ด.

  • ๋ฐ์ดํ„ฐ ๋ฐ›๊ธฐ

    recv() ํ•จ์ˆ˜ ํ˜ธ์ถœํ•œ๋‹ค.

    int recv(SOCKE osck, char* buf, int len, int flags);

    buf ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ด ๋„ฃ์„ ๋ฒ„ํผ. ๋ณต์‚ฌํ•˜๊ณ  ๋‚˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์†Œ์ผ“ ๋‚ด๋ถ€์˜ ์ˆ˜์‹  ๋ฒ„ํผ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

    len ์€ ๋ฒ„ํผ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์˜ ์ƒํ•œ์„ .

    flags ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์‹ ์„ ์ œ์–ดํ•˜๋Š” ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ ํ•ญ์ƒ ๊ทธ๋žฌ๋“ฏ 0์œผ๋กœ..

    ํ˜ธ์ถœ ์„ฑ๊ณต ์‹œ ์ˆ˜์‹ ํ•œ ๋ฐ”์ดํŠธ์˜ ๊ธธ์ด๋ฅผ ๋ฆฌํ„ด ์ด๋Š” len ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์ด ๋œ๋‹ค.

    ๋˜ํ•œ, send() ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•ด์„œ ์ผ์ • ๊ธธ์ด์˜ ๋ฐ”์ดํŠธ๋ฅผ ๋ณด๋‚ด๋„, ์ƒ๋Œ€ํŽธ์ด recv() ํ˜ธ์ถœ ์‹œ ๋˜‘๊ฐ™์€ ๊ธธ์ด๋ฅผ ๋ฐ›๋Š”๋‹ค๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒ๋ฉด ๋ณด๋‚ด๋Š” ์ธก์˜ ๋„ท์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ ๋‹นํ•œ ํฌ๊ธฐ๊ฐ€ ๋  ๋–„๊นŒ์ง€ ๋ฐ์ดํ„ฐ ๋ณด๊ด€ ํ›„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ๋–„๋ฌธ.

    ํ•œ๊ฐ€์ง€ ํŒ์œผ๋กœ๋Š” len ์— 0์„ ๋„ฃ์–ด recvํ˜ธ์ถœ ํ•ด 0์ด ๋ฆฌํ„ด๋˜๋ฉด -> ์ด๋Š” ์†Œ์ผ“์—์„œ ์ฝ์„ ๊ฒƒ์ด ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์†Œ์ผ“์ด ์ฝ์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋–„๋งŒ ๋ฒ„ํผ ํ• ๋‹นํ•˜๊ณ  recvํ˜ธ์ถœ ํ•˜๋ฉด๋œ๋‹ค.

    -1 ๋ฆฌํ„ด์ธ ๊ฒฝ์šฐ ์—๋Ÿฌ.

    ๋””ํดํŠธ๋กœ ์ˆ˜์‹  ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ด ์ˆ˜์‹ ๋  ๋–„ ๊นŒ์ง€ ํ˜น์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋  ๋–„์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

5.2 ์ž๋ฃŒํ˜• ์•ˆ์ •์„ฑ์„ ๋ณด๊ฐ•ํ•œ TCP ์†Œ์ผ“

117์ชฝ ์ฐธ๊ณ 


6. ๋ธ”๋กœํ‚น I/O์™€ ๋…ผ๋ธ”๋กœํ‚น I/O

์†Œ์ผ“ ๊ด€๋ จ ํ•จ์ˆ˜๋Š” ๋Œ€๋ถ€๋ถ„ ๋ธ”๋กœํ‚น ํ˜ธ์ถœ์ด๋ฉฐ, ๋ฐ›์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋–„ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น ๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์‹ ๋  ๋–„ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์•ž์„œ ๋ฐฐ์šด send(), accept(), connect() ํ•จ์ˆ˜ ๋ชจ๋‘ ๋ธ”๋กœํ‚น ํ˜ธ์ถœ ์ด๋‹ค.

์‹ค์‹œ๊ฐ„ ๊ฒŒ์ž„์—์„œ๋Š” ์ด๊ฐ™์€ ์ง€์—ฐ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค. ์„œ๋ฒ„ ์Šค๋ ˆ๋“œ๋Š” ์—ฌ๋Ÿฌ ์†Œ์ผ“ ์ค‘ ํ•˜๋‚˜ recv()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ํ•ด๋‹น ํด๋ผ๊ฐ€ ๋ฐ์ดํ„ฐ ๋ณด๋ƒˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋™์•ˆ ๋ธ”๋กœํ‚น ๋˜์–ด์žˆ์œผ๋ฉด, ๋‹ค๋ฅธ ์†Œ์ผ“์„ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†๋‹ค. -> ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฝ ๊ฐ€๋Šฅํ•œ๋ฐ, ๋ฐ”๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ, ๋…ผ๋ธ”๋กœํ‚นI/O, select() ํ•จ์ˆ˜๊ฐ€ ๊ทธ๊ฒƒ์ด๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ์€ ๋ง๊ทธ๋Œ€๋กœ ์Šค๋ ˆ๋“œ ์—ฌ๋Ÿฌ๊ฐœ ๋‘ฌ์„œ ๊ทน๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•.

๋…ผ๋ธ”๋กœํ‚น I/O ๋Š” ์†Œ์ผ“์„ ๋…ผ๋ธ”๋กœํ‚น ๋ชจ๋“œ๋กœ ์„ค์ •(์ง€์›ํ•จ).

int ioctlsocket(SOCKET sock, long cmd, u_long* argp);

sock์€ ๋…ผ๋ธ”๋กœํ‚น ํ•˜๊ณ ์žํ•˜๋Š” ์†Œ์ผ“.

cmd๋Š” ์ œ์–ดํ•˜๊ณ ์ž ํ•˜๋Š” ์†Œ์ผ“ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณดํ†ต FIONBIO๋ฅผ ์ง€์ •.

argp๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— ์„ค์ •ํ•˜๋ จ๋Š ๊ฐ’, 0์ด ์•„๋‹Œ๊ฐ’์ด๋ฉด ๋…ผ๋ธ”๋กœํ‚น, 0์ด๋ฉด ๋ธ”๋กœํ‚น๋ชจ๋“œ ์ง€์ •.

-> ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ธ”๋กœํ‚น ๊ฑธ๋˜ ํ•จ์ˆ˜๋“ค์ด ์ด์ œ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋ฆฌํ„ดํ•œ๋‹ค.

๋…ผ๋ธ”๋กœํ‚น ์†Œ์ผ“์€ ๊ฐ„ํŽธํ•˜๋ฉด์„œ๋„ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ ์ˆ˜๊ธด๋œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•.

ํ•˜์ง€๋งŒ, ํด๋ง ํ•ด์•ผ ํ•  ์†Œ์ผ“์˜ ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•๋„ ๋น„ํšจ์œจ์ ์ด๋‹ค.(๋ณ‘๋ชฉํ˜„์ƒ ๋“ฑ)

select()ํ•จ์ˆ˜ ๋Š” ์†Œ์ผ“์„ ํ•œ๊บผ๋ฒˆ์— ํ™•์ธ ํ•˜๊ณ  ๊ทธ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ค€๋น„๋˜๋ฉด ์ฆ‰์‹œ ๋Œ€์‘๋˜๋Š” ๋ฐฉ๋ฒ•.

int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const timeval* timeout);

nfds ๋Š” POSIXํ”Œ๋žซํผ์—์„œ ์†Œ์ผ“ ์‹๋ณ„์ž ํ™•์ธ์šฉ์œผ๋กœ ๋„ฃ๋Š” ์ธ์ž.(์œˆ๋„์—์„  ๋ฌด์‹œํ•ด๋„ ๋จ)

readfds ๋Š” ์†Œ์ผ“ ์ปฌ๋ ‰์…˜์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ fd_setํ˜• ์ด๋‹ค. ์ฝ์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•  ์†Œ์ผ“์„ ๋„ฃ๋Š”๋‹ค.

writefds ๋Š” ์“ฐ๊ธฐ์šฉ์œผ๋กœ ์ฒดํฌํ•˜๊ณ  ์‹ถ์€ ์†Œ์ผ“์„ ๋‹ด๋Š”๋‹ค.

exceptfds ๋Š” ์—๋Ÿฌ ๊ฒ€์‚ฌํ•˜๊ณ ์ž ํ•œ๋Š ์†Œ์ผ“์„ ๋‹ด๋Š”๋‹ค.

timeout ์€ ์ตœ๋Œ€ ์ œํ•œ ์‹œ๊ฐ„ใ…‡๋ฅด ์ง€์ •.

select() ํ•จ์ˆ˜๋Š” ๋ฆฌํ„ด ์‹œ์ ์— readfds, writefds, exceptfds์— ๋‚จ์•„์žˆ๋Š” ์†Œ์ผ“ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด ์ฆ‰ ์„ธ ์ง‘ํ•ฉ์˜ ์ด ๋‚˜์€ ๊ฐœ์ˆ˜ ๋ฆฌํ„ด. ์‹œ๊ฐ„ ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ์—” 0์„ ๋ฆฌํ„ดํ•œ๋‹ค.