๐ ๋ฐฉ์ฑ๋ฒ ๋ธ๋ก๊ทธ > ๐ง ๋ฆฌ๋ ์ค
192.168.0.1
๊ฐ์ IP ์ฃผ์ ์ฒด๊ณ๋ฅผ ์ธํฐ๋ท ํ๋กํ ์ฝ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ํ๋กํ ์ฝ์์๋ ์ฌ์ฉํ ์ ์๋๋ก, IP ์ฃผ์ ์ฒด๊ณ๋ฅผ ์ง์นญํ ๋๋ AF_INET
, IP ์์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ๋๋ PF_INET
์ ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
์๋ ์์๋ C๋ก ์์ฑํ ์ ํ์ ์ธ ์์ผ ์์ฑ ์ฝ๋์
๋๋ค. ์ด ์์์์ AF_INET
๊ณผ PF_INET
์ด ์ฌ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค:
struct sockaddr_in addr;
int sockfd;
// AF_INET
addr.sin_family = AF_INET;
addr.sin_port = htons(54321);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// PF_INET
sockfd = socket(PF_INET, SOCK_STREAM, 0);
AF_INET
๊ณผ PF_INET
์์์ INET์ "I"nter"NET"์ ์ค์๋ง๋ก, ์ธํฐ๋ท ํ๋กํ ์ฝ์ ๋ปํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด, AF์ PF๋ ๋ฌด์์ผ๊น์?
์์ฃผ ์ค๋ ์ ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ์ค๊ณํ ์ฌ๋๋ค์, ํ์ฅ์ฑ์ ์ํด ํ ์ข
๋ฅ์ '์ฃผ์ ์ฒด๊ณ'๊ฐ ์ฌ๋ฌ 'ํ๋กํ ์ฝ'์ ์ง์ํ ์ ์๋๋ก ํ์ต๋๋ค1. ์ธํฐ๋ท ํ๋กํ ์ฝ์ ์๋ก ๋ค์๋ฉด, 192.168.0.1
, 8.8.4.4
๊ฐ์ ์ฃผ์ ์ฒด๊ณ๊ฐ ์ธํฐ๋ท ํ๋กํ ์ฝ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ํ๋กํ ์ฝ๋ ์ง์ํ๋ ์์
๋๋ค.
์ด ๋ ๊ฐ๋ ์ ๋ถ๋ฆฌ๊ฐ ์ฝ๋ ๋ด์์ ๋ ๋ช ํํ๊ฒ ๊ตฌ๋ถ๋ ์ ์๋๋ก, ๊ฐ์ ํ๋กํ ์ฝ์ผ์ง๋ผ๋ ์ด๊ฒ์ด '์ฃผ์ ์ฒด๊ณ'๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฐ์ด๋ 'ํ๋กํ ์ฝ'์ ์ง์ ํ๋ ๋ฐ ์ฐ์ด๋์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์ด๋ฆ์ ์ฌ์ฉํ๊ฒ๋ ํ์ต๋๋ค:
sockaddr_in
๊ตฌ์กฐ์ฒด์ฒ๋ผ ์์ผ์ ์ฃผ์์ ํจ๊ป '์ฃผ์ ์ฒด๊ณ'๋ฅผ ์ง์ ํ๊ธฐ ์ํด์๋ AF๋ก ์์ํ๋ ์ด๋ฆ(AF_INET
, AF_IPX
, โฆ)๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. AF๋ Address Family์ ์ค์๋ง์
๋๋ค.
socket()
ํจ์์ฒ๋ผ ์ค์ ์ฐ๊ฒฐ์ ํ๊ธฐ ์ํ 'ํ๋กํ ์ฝ'์ ์ง์ ํ๊ธฐ ์ํด์๋ PF๋ก ์์ํ๋ ์ด๋ฆ(PF_INET
, PF_IPX
, โฆ)๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. PF๋ Protocol Family์ ์ค์๋ง์
๋๋ค.
๋ฌผ๋ก ํ๋์ ์ฃผ์ ์ฒด๊ณ๊ฐ ์ฌ๋ฌ ํ๋กํ ์ฝ์ ์ง์ํ๋ ์ผ์ ์ค์ ๋ก ์ผ์ด๋์ง ์์์ต๋๋ค2.
๋ฆฌ๋ ์ค ์ปค๋์์๋ ์ด ๋ ์์ ์ข ๋ฅ๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ , PF๋ก ์์ํ๋ ์์์ AF๋ก ์์ํ๋ ์์๊ฐ ์๋ก ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋๋ก ์ ์ํ๊ณ ์์ต๋๋ค:
/* Protocol families, same as address families. */
#define PF_UNSPEC AF_UNSPEC
#define PF_UNIX AF_UNIX
#define PF_LOCAL AF_LOCAL
#define PF_INET AF_INET
์ฆ, ๋ฆฌ๋ ์ค์์๋ PF๋ฅผ ์จ์ผ ํ ์๋ฆฌ์ AF๋ฅผ ์จ๋ ๋๊ณ , AF๋ฅผ ์จ์ผ ํ ์๋ฆฌ์ PF๋ฅผ ์จ๋ ๋ฉ๋๋ค.
AF์ PF๋ ์๋ก ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๊น์? ์๋ ์๋๋ฅผ ์กด์คํ์ฌ AF๋ฅผ ์ธ ์๋ฆฌ์๋ AF๋ฅผ, PF๋ฅผ ์ธ ์๋ฆฌ์๋ PF๋ฅผ ์จ์ผ ํ ๊น์? ์๋๋ฉด ๋จ์ํ AF์ PF ์ค ํ๋๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ ๊น์?
๋ช๋ช ์ฌ๋ก๋ฅผ ์กฐ์ฌํ์ง๋ง, ๊ถ์ฅ ๋ฐฉ์์ด ์ด๋ ํ๋๋ก ํต์ผ๋์ด ์์ง๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ช ํ ์์ผ ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ์์ธ <Beej's Guide to Network Programming>์์๋ AF_INET๊ณผ PF_INET์ ์ค๊ณ ๋น์์ ์๋๋๋ก ๊ตฌ๋ณํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค:
So the most correct thing to do is to use AF_INET in your struct sockaddr_in and PF_INET in your call to socket().
๋ฐ๋ฉด, ๋ฆฌ๋ ์ค ๋งจ ํ์ด์ง(์ BSD ๋งจ ํ์ด์ง)์์๋ ๋ชจ๋ ๊ณณ์ AF๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค:
... already the BSD man page promises: "The protocol family generally is the same as the address family", and subsequent standards use AF_* everywhere.
http://beej.us/guide/bgnet/html/#socket
โฉOnce upon a time, a long time ago, it was thought that maybe an address family (what the โAFโ in โAF_INETโ stands for) might support several protocols that were referred to by their protocol family (what the โPFโ in โPF_INETโ stands for).
http://beej.us/guide/bgnet/html/#socket
โฉThat didnโt happen. And they all lived happily ever after, The End.