์ํํ ์๋ฒ๊ด๋ จ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ฑฐ๋ ์๋ฒํ๋จธ๋ถ๊ณผ์ ํ์ ์ ์ํด
์์ผ๋ถ๋ถ ์์ ๊ณต๋ถ
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๋ฐ์ดํฐ๊ทธ๋จ ํจํท.
__IPPROOTCP__ : ํ์์์ผ ์ข ๋ฅ๋ SOCKSTREAM์ด๋ฉฐ, ์๋ฏธ๋ TCP ์ธ๊ทธ๋จผํธ ํจํท.
__IPPROTOIP ๋๋ 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๋ฆฌํด.
-
์์ผ ๋ฐ์ธ๋ฉ์ ์๋ฏธ
- ์ด์์ฒด์ ๊ฐ ์ด ์ฃผ์์ ํฌํธ๋ฅผ ๋ชฉ์ ์ง๋ก ๋ฐ์ ๋ ํจํท์ ์์ ํ๋ฉด ์ด์์ฒด์ ๋ ์ด์ ์ด ์์ผ์ผ๋ก ๋๊ฒจ์ค๋ค.
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-์จ์ด ํธ๋์ ฐ์ดํน ์ ๊ฑฐ์ณ์ผํ๋ค.
-
์ฒซ๋จ๊ณ ๋ ๋ง๋ค์ด๋ ์์ผ์ ํน์ ํฌํธ ๋ฐ์ธ๋ฉ ํ ๋ค ๋ค์ด์ค๋ ํธ๋์ ฐ์ดํน์ ๋ฆฌ์ค๋ ํด์ผํ๋ค.
socket() ๋ง๋ค๊ณ bind() ๋ฐ์ธ๋ฉ ํ, listen()์ผ๋ก ๋ฆฌ์ค๋์ ์์ํ๋ค.
int listen(SOCKET sock, int backlog);
sock
์ ๋ฆฌ์ค๋ ๋ชจ๋์ ๋ ์์ผ. ์์ผ์ด ๋ฆฌ์ค๋ ๋ชจ๋์ ์์ผ๋ฉด์ธ๋ถ์์ ์ค๋ TCPํธ๋์ ฐ์ดํน ์ฒซ ๋จ๊ณ ์ฌ์ฒญ์ ๋ฐ์ ๋๊ธฐ์ด์ ์ ์ฅํด ๋๋ค. ๊ทธ ๋คaccept()
ํธ์ถ ํ๋ฉด ๊ทธ ๋ค์ ํธ๋์ ฐ์ดํน ๋จ๊ณ ์ํ.backlog
๋ ๋ค์ด์ค๋ ์ฐ๊ฒฐ์ ๋๊ธฐ์ด์ ๋ ์ต๋ ์ซ์๋ฅผ ์ง์ . ๊ฐ๋์ฐจ๋ฉด ๊ทธ ์ดํ์ ๋ค์ด์ค๋ ค๋ ์ฐ๊ฒฐ์ ๋๊ธด๋ค. ๊ธฐ๋ณธ๊ฐ ์ฌ์ฉ ์SOMAXCONN
์ ๋ฃ์ด์ฃผ์.์ฑ๊ณต ์ 0, ์๋ฌ ์ -1์ ๋ฆฌํดํ๋ค.
-
๋ค์ด์ค๋ ์ฐ๊ฒฐ์ ๋ฐ์ ๊ณ์ TCPํธ๋์ ฐ์ดํน ์งํํ๋ ค๋ฉด
accept()
๋ฅผ ํธ์ถํ๋ค.SOCKET accept(SOCKET sock, sockaddr* addr, int* addrlen);
sock
์ ๋ฆฌ์ค๋ ๋ชจ๋์ ์์ผ์ผ๋ก, ์ฌ๊ธฐ์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ๊ฒ ๋๋ค.addr
์accept()
ํจ์๊ฐ ์ฐ๊ฒฐ์ ์์ฒญํ๋ ์๊ฒฉ ํธ์คํธ์ ์ฃผ์๋ฅผ ์ฑ์์ค sockaddr ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ.(๊ทธ์ ์ฃผ์๋ฅผ ๋ฐ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉ.)addrlen
์ addr ๋ฒํผ์ ํฌ์ธํฐ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ ์ฉ๋๋ก ์ฌ์ฉ. ์ด ๋ํaddr
๋ด์ฉ์ด ์ฑ์์ง ๋ ๊ฐ์ด ์ฑ์์ง๋ค.ํจ์๊ฐ ์ฑ๊ณตํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ์ ์์ผ์ด ๋ง๋ค์ด์ ธ ๋ฆฌํด ๋๋ฉฐ ์ด ์์ผ์ ์ดํ ์๊ฒฉ ํธ์คํธ์ ํต์ ํ๋ ์ฉ๋๋ก ์ธ ์ ์๋ค. ์ ์์ผ์ ๋ฆฌ์ค๋ ์์ผ๊ณผ ๊ฐ์ ํฌํธ์ ๋ฐ์ธ๋ฉ ๋๋ค. TCP๋ ์ฐ๊ฒฐ๋ ๊ฐ ์๊ฒฉ ํธ์คํธ ๋ง๋ค ์์ผ์ ํ๋์ฉ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค๋ ์ฌ์ค์ ๊ธฐ์ตํด๋์!!
๋ฆฌํด ๋ ์ ์์ผ์ ์๊ฒฉ ํธ์คํธ์ ๋์๋๋ฉฐ, ์๊ฒฉํธ์คํธ์ ์ฃผ์์ ํฌํธ๊ฐ ๊ธฐ๋ก๋๊ณ ์ด ํธ์คํธ๋ก ๋ณด๋ด๋ ํจํท ์ ๋ถ๊ฐ ์ ์ฅ๋์ด ๋์ค์ ๋๋ฝ์ด ๋ฐ์ํด๋ ์ฌ์ ์ก ํ ์ ์๊ฒ ์ฌ์ฉ๋๋ค.
-
์๋ฒ๋
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์ ๋ฆฌํดํ๋ค.