๐Ÿ  ๋ฐฉ์„ฑ๋ฒ” ๋ธ”๋กœ๊ทธ > ๐Ÿง ๋ฆฌ๋ˆ…์Šค

AF_INET vs PF_INET

192.168.0.1๊ฐ™์€ IP ์ฃผ์†Œ ์ฒด๊ณ„๋ฅผ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, IP ์ฃผ์†Œ ์ฒด๊ณ„๋ฅผ ์ง€์นญํ•  ๋•Œ๋Š” AF_INET, IP ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ๋Š” PF_INET์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

AF_INET๊ณผ 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๊ฐ™์€ ์ฃผ์†Œ ์ฒด๊ณ„๊ฐ€ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ๋„ ์ง€์›ํ•˜๋Š” ์‹์ž…๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐœ๋…์˜ ๋ถ„๋ฆฌ๊ฐ€ ์ฝ”๋“œ ๋‚ด์—์„œ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋  ์ˆ˜ ์žˆ๋„๋ก, ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ์ผ์ง€๋ผ๋„ ์ด๊ฒƒ์ด '์ฃผ์†Œ ์ฒด๊ณ„'๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ ์“ฐ์ด๋ƒ 'ํ”„๋กœํ† ์ฝœ'์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์“ฐ์ด๋ƒ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋” ํ–ˆ์Šต๋‹ˆ๋‹ค:

AF์™€ PF์˜ ๊ตฌ๋ถ„์€ ๋ฌด์˜๋ฏธ

๋ฌผ๋ก  ํ•˜๋‚˜์˜ ์ฃผ์†Œ ์ฒด๊ณ„๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋Š” ์ผ์€ ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค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.

Footnotes

  1. 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).

    โ†ฉ
  2. http://beej.us/guide/bgnet/html/#socket

    That didnโ€™t happen. And they all lived happily ever after, The End.

    โ†ฉ