ÇöÀç°­Á : UNIX BSD ¼ÒÄÏ ½Ã½ºÅÛ ÄÝ ÀÌÀü: 2.2 ÀÎÅÍ³Ý ÁÖ¼Ò º¯È¯ ´ÙÀ½: 2.4 ¼­¹ö ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷


2.3 Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷

¢º º» Àý¿¡¼­´Â Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ ÀÛ¼º ÀýÂ÷¸¦ ¼³¸íÇÏ°í, well-known ¼­ºñ½º Æ÷Æ®¸¦ ÀÌ¿ëÇϴ Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ mydaytime.c¿Í myecho.c¸¦ ¼Ò°³ÇÑ´Ù.

2.3.1 ¿¬°áÇü Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷

¢º TCP(¿¬°áÇü ¶Ç´Â ½ºÆ®¸²Çü) Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ÀϹÝÀûÀÎ ÀÛ¼º ÀýÂ÷¸¦ ±×¸² 2-7¿¡ ³ªÅ¸³Â´Ù.

¢º 2.1.5Àý¿¡¼­ ¼Ò°³ÇÑ ¹Ù¿Í °°ÀÌ Å¬¶óÀ̾ðÆ®´Â ¸ÕÀú socket()À¸·Î ¼ÒÄÏÀ» °³¼³ÇÑ´Ù.

¢º ¿¬°áÇü ¼­ºñ½º¸¦ ÀÌ¿ëÇϱâ À§ÇÏ¿© connect()¸¦ È£ÃâÇÏ¿© ¼­¹ö¿Í ¿¬°áÀ» ¿äûÇÏ°í ¿¬°áÀÌ ÀÌ·ç¾îÁö¸é send()¿Í recv()¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ¼Û¼ö½ÅÇÏ°í ÀÛ¾÷ÀÌ Á¾·áµÇ¸é close()·Î ¼ÒÄÏÀ» ´Ý´Â´Ù.

±×¸² 2-7 TCP(¿¬°áÇü) Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷

(1) socket(), ¼ÒÄÏ °³¼³

¢º Ŭ¶óÀ̾ðÆ®´Â ¸ÕÀú socket()À¸·Î ¼ÒÄÏÀ» °³¼³ÇØ¾ß Çϴµ¥ À̶§ ÇÁ·ÎÅäÄÝ Ã¼°è¸¦ PF_INET·Î ¼±ÅÃÇÏ°í, ¼­ºñ½º ŸÀÔÀº SOCK_STREAMÀ¸·Î ¼±ÅÃÇÑ´Ù.

¢º ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» Çϱâ À§ÇÏ¿©´Â ´Ù¼¸ °¡Áö ¿ä¼Ò Áï, »ç¿ëÇÒ Æ®·£½ºÆ÷Æ® ÇÁ·ÎÅäÄÝ(½ºÆ®¸² ¶Ç´Â µ¥ÀÌÅͱ׷¥), ÀڽŰú »ó´ë¹æÀÇ IP ÁÖ¼Ò, ÀڽŰú »ó´ë¹æÀÇ Æ÷Æ®¹øÈ£°¡ ÁöÁ¤µÇ¾î¾ß ÇÑ´Ù°í ÇÏ¿´´Ù(2.1.3Àý ÂüÁ¶).

¢º socket()À» È£Ãâ½Ã¿¡´Â Æ®·£½ºÆ÷Æ® ÇÁ·ÎÅäÄݸ¸À» ÁöÁ¤ÇÏ°Ô µÇ´Âµ¥ ±×¸² 2-8¿¡ socket() ¼öÇà½Ã ³»ºÎÀûÀ¸·Î ÀϾ´Â µ¿ÀÛÀ» ³ªÅ¸³Â´Ù. ¿©±â¼­ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ÇÁ·ÎÅäÄÝÀ» ÁöÁ¤ÇÏ¿© socket()À» È£ÃâÇÏ¸é ¼ÒÄÏ ÀÎÅÍÆäÀ̽º°¡ »õ·Î »ý¼ºµÈ ¼ÒÄÏÀÇ ¼ÒÄϹøÈ£¸¦ ¸®ÅÏÇÏ´Â °ÍÀ» º¸¿©ÁÖ°í ÀÖ´Ù.

¢º ÇÑÆí Ŭ¶óÀ̾ðÆ®´Â ÀÚ½ÅÀÌ »ç¿ëÇÒ Æ÷Æ®¹øÈ£¸¦ ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. Áï, Ŭ¶óÀ̾ðÆ®´Â bind()¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾øÀÌ ´ÙÀ½¿¡ ¼³¸íÇÒ connect() È£Ãâ½Ã ½Ã½ºÅÛ(TCP/IP)ÀÌ ÀÓÀÇÀÇ Æ÷Æ®¹øÈ£¸¦ ÁöÁ¤ÇØ ÁØ´Ù.

±×¸² 2-8 socket() È£Ãâ½Ã ¼ÒÄÏ ¹øÈ£¿Í ¼ÒÄÏ ÀÎÅÍÆäÀ̽ºÀÇ°ü°è

(2) ¿¬°áÇÒ ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼(sockaddr_in) ÀÛ¼º

¢º Ŭ¶óÀ̾ðÆ®´Â connect()¸¦ È£ÃâÇϱâ Àü¿¡ ¿¬°áÇÏ°íÀÚ ÇÏ´Â ¼­¹öÀÇ ÁÖ¼Ò¸¦ ÁöÁ¤ÇÑ´Ù.

¢º 4¹ÙÀÌÆ®ÀÇ IP ÁÖ¼Ò¿Í 2¹ÙÀÌÆ®ÀÇ Æ÷Æ®¹øÈ£¸¦ Æ÷ÇÔÇÏ´Â ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ sockadr_in¸¦ ÀÛ¼ºÇÏ¿©¾ß ÇÑ´Ù(2.1.4Àý ÂüÁ¶).

(3) connect(), ¼­¹ö¿Í ¿¬°á¿äû

¢º (2)¿¡¼­ ¸¸µç ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¸¦ »ç¿ëÇÏ¿© ¼­¹ö¿¡°Ô Á¢¼Ó¿äûÀ» Çϱâ À§ÇÏ¿© connect()¸¦ È£ÃâÇÑ´Ù.

¢º ±×¸² 2-9¿¡ connect()ÀÇ ¼öÇà ³»¿ëÀ» ³ªÅ¸³Â´Âµ¥, con- nect()´Â »ó´ë¹æ Áï, ¼­¹öÀÇ IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£¸¦ ¸í½ÃÇÏ¿© (1)¿¡¼­ ±¸ÇÑ ¼ÒÄϹøÈ£·Î È£ÃâÇÏ¸é µÈ´Ù.

¢º connect()ÀÇ »ç¿ë ¹®¹ýÀº ¾Æ·¡¿Í °°´Ù.

int connect (

int s, /* ¼­¹ö¿Í ¿¬°á½Ãų ¼ÒÄϹøÈ£ */

const struct sockaddr *addr, /* »ó´ë¹æ ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */

int addrlen); /* ±¸Á¶Ã¼ *addrÀÇ Å©±â */

¢º connect()¸¦ È£ÃâÇϸé TCP°¡ ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ *addr¿¡ ÁöÁ¤µÈ ¸ñÀûÁö IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£·Î ¿¬°áÀ» ½ÃµµÇÏ¿© ¿¬°áÀÌ ¼º°øÇϸé 0À» ¸®ÅÏÇÑ´Ù.

¢º ½ÇÆÐÇϸé -1À» ¸®ÅÏÇϸç Àü¿ªº¯¼ö errno¿¡ ¿¡·¯Äڵ尡 µé¾î ÀÖ°Ô µÈ´Ù.

¢º Ŭ¶óÀ̾ðÆ®°¡ È£ÃâÇÑ connect()°¡ ¼º°øÀûÀ¸·Î ¿¬°áµÇ·Á¸é ¼­¹ö¿¡¼­ accept()¸¦ È£ÃâÇØ µÎ°í ÀÖ¾î¾ß ÇÑ´Ù.

¢º ÇÑÆí, connect() ½Ã½ºÅÛ ÄÝ È£Ãâ Áß¿¡ ¿¡·¯°¡ ¹ß»ýÇÏ¿´À» ¶§´Â ¹Ù·Î ´Ù½Ã connect()¸¦ È£ÃâÇÏÁö ¸»°í ÇØ´ç ¼ÒÄÏÀ» close()·Î ´Ý°í, »õ·Î¿î ¼ÒÄÏÀ» socket()À¸·Î ¸¸µç ÈÄ »ç¿ëÇÏ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù.

±×¸² 2-9 connect() È£Ãâ½Ã ¼ÒÄϹøÈ£¿Í ¼ÒÄÏ ÁÖ¼ÒÀÇ °ü°è

(4) send(), recv(), µ¥ÀÌÅÍ ¼Û¼ö½Å

¢º Ŭ¶óÀ̾ðÆ®°¡ ¼­¹ö¿Í ¿¬°áµÇ¸é send(), recv() ¶Ç´Â write(), read()¸¦ »ç¿ëÇÏ¿© ¼­¹ö¿Í µ¥ÀÌÅ͸¦ ¼Û¼ö½ÅÇÒ ¼ö ÀÖ´Ù.

¢º ÀÌµé µ¥ÀÌÅÍ ¼Û¼ö½Å ÇÔ¼öµéÀ» Ç¥ 2-1¿¡ Á¤¸®ÇÏ¿´À¸¸ç ÀÚ¼¼ÇÑ ³»¿ëÀº ºÎ·Ï A.2¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.

¹® ¹ý

ÀÎ ÀÚ

int send(int s, char* buf,

int length, int flags);

s ¼ÒÄϹøÈ£
buf Àü¼ÛÇÒ µ¥ÀÌÅÍ°¡ ÀúÀåµÈ ¹öÆÛ
length buf ¹öÆÛÀÇ Å©±â
flags º¸Åë 0
int write(int s, const void*

buf, int length);

s ¼ÒÄϹøÈ£
buf Àü¼ÛÇÒ µ¥ÀÌÅÍ°¡ ÀúÀåµÈ ¹öÆÛ
length buf ¹öÆÛÀÇ ±æÀÌ
int recv(int s, char* buf,

int length, int flags);

s ¼ÒÄϹøÈ£
buf ¼ö½Å µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ
length buf ¹öÆÛÀÇ ±æÀÌ
flags º¸Åë 0
int read(int s, void* buf,

int length);

s ¼ÒÄϹøÈ£
buf ¼ö½Å µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ
length buf ¹öÆÛÀÇ ±æÀÌ

Ç¥ 2-1 TCP(½ºÆ®¸²) ¼ÒÄÏÀÇ µ¥ÀÌÅÍ ¼Û¼ö½Å ÇÔ¼ö ºñ±³

¢º send()¿Í write()´Â ½ºÆ®¸²Çü(TCP) ¼ÒÄÏÀ» ÅëÇÏ¿© ÆÐŶÀ» ¼Û½ÅÇÏ´Â ÇÔ¼öÀÌ´Ù.

¢º µ¥ÀÌÅ͸¦ Àü¼ÛÇÒ ¼ÒÄϹøÈ£(s), ¼Û½ÅÇÒ µ¥ÀÌÅÍ ¹öÆÛ(buf), Àü¼ÛÇÒ µ¥ÀÌÅÍ Å©±â(length)¸¦ ÁöÁ¤ÇØ¾ß ÇÏ¸ç µÎ ÇÔ¼ö ¸ðµÎ ½ÇÁ¦·Î Àü¼ÛµÈ µ¥ÀÌÅÍ Å©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ¸®ÅÏÇÑ´Ù.

¢º recv()¿Í read()´Â ½ºÆ®¸²Çü(TCP) ¼ÒÄÏÀ» ÅëÇÏ¿© ÆÐŶÀ» ¼ö½ÅÇÏ´Â ÇÔ¼öÀÌ¸ç µ¥ÀÌÅ͸¦ ¼ö½ÅÇÒ ¼ÒÄϹøÈ£(s), ¼ö½Å ¹öÆÛ(buf), ÀÐÀ» µ¥ÀÌÅÍ Å©±â(length)¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù. µÎ ÇÔ¼ö ¸ðµÎ ½ÇÁ¦·Î ÀÐÀº µ¥ÀÌÅÍ Å©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ¸®ÅÏÇÑ´Ù.

¢º ½ºÆ®¸² ¼ÒÄÏ¿¡¼­´Â IP ÆÐŶÀÌ ÇÑ ¹ø¿¡ Àü¼ÛÇÒ ¼ö ÀÖ´Â ÃÖ´ë µ¥ÀÌÅÍ Å©±âº¸´Ù Å« µ¥ÀÌÅ͸¦ ¼Û½Å ¹öÆÛ¿¡ ÀúÀåÇÏ°í write()³ª send()¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.

¢º À̶§¿¡´Â Àüü µ¥ÀÌÅÍ°¡ IP ÆÐŶ ´ÜÀ§·Î ºÐÇҵǾî Àü¼ÛµÇ¸ç ¼ö½ÅÃø¿¡¼­´Â ÆÐŶÀÇ ¼ø¼­¿Í ºÐ½ÇÀ» °Ë»çÇÏ°í ÇÊ¿äÇϸé ÀçÀü¼ÛÀ» ¿ä±¸Çϴµ¥ ÀÌ°ÍÀÌ ¹Ù·Î ½ºÆ®¸²(stream) ¼ÒÄÏÀ» »ç¿ëÇÏ´Â ÀåÁ¡À̱⵵ ÇÏ´Ù.

¢º ±×·¯³ª ´ÙÀ½ Àý¿¡¼­ ¼³¸íÇÒ UDP ¼ÒÄÏ¿¡¼­´Â »ç¿ëÀÚ°¡ Àü¼ÛÀ» ¿ä±¸ÇÑ µ¥ÀÌÅÍÀÇ Å©±â°¡ µ¥ÀÌÅͱ׷¥ Å©±âº¸´Ù Å©¸é ¿¡·¯°¡ ¹ß»ýÇϰųª µ¥ÀÌÅͱ׷¥ Å©±â¸¸Å­¸¸ ÇÑ ¹ø Àü¼ÛµÇ°í ¸¸´Ù.

(5) close(), ¼ÒÄÏ ´Ý±â

¢º¼ÒÄÏÀÇ »ç¿ëÀ» ¸¶Ä¡·Á¸é ÇØ´ç ¼ÒÄϹøÈ£(s)¸¦ ÁöÁ¤ÇÏ¿© ´ÙÀ½°ú °°ÀÌ close()¸¦ È£ÃâÇÏ¿© ¼ÒÄÏÀ» Á¾·áÇÏ¿©¾ß ÇÑ´Ù.

close(s);

¢º close()¸¦ È£ÃâÇÑ ½ÃÁ¡¿¡ ¼­¹ö³ª Ŭ¶óÀ̾ðÆ®ÀÇ ¼Û½Å ¹öÆÛ¿¡ ÀÖÀ¸³ª ¾ÆÁ÷ Àü¼ÛÇÏÁö ¸øÇÑ, ¶Ç´Â ³×Æ®¿÷³»¿¡¼­ Àü´ÞÁßÀÎ ÆÐŶµéÀÌ ÀÖÀ» ¼ö Àִµ¥ close()´Â µðÆúÆ®·Î ÀÌ·¯ÇÑ ÆÐŶµéÀ» ¸ðµÎ ó¸®ÇÑ ÈÄ¿¡ ¼ÒÄÏÀ» ´Ý°Ô µÇ¾î ÀÖ´Ù.

¢º ÀÌ·¯ÇÑ ÆÐŶµéÀ» º¸´Ù ±¸Ã¼ÀûÀ¸·Î (¼öµ¿ÀûÀ¸·Î) ó¸®Çϱâ À§ÇÏ¿© shutdown() ½Ã½ºÅÛ ÄÝÀ» ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

shutdown(s, direction);

¡¡

¢º À§¿¡¼­ s´Â ´ÝÀ» ¼ÒÄϹøÈ£ÀÌ°í, directionÀº 0À̸é ÆÐŶÀÇ Àü¼ÛÀ» Á¾·áÇÏ°í 1ÀÌ¸é ¼ö½ÅÀ» Á¾·áÇϸç 2ÀÌ¸é ¼Û¼ö½ÅÀ» ¸ðµÎ Á¾·áÇÏ°Ô ÇÑ´Ù.

¢º ¿¹¸¦µé¾î Ŭ¶óÀ̾ðÆ®°¡ ´õ ÀÌ»ó Àü¼ÛÇÒ µ¥ÀÌÅÍ°¡ ¾øÀ¸¸é directionÀ» 0À¸·Î ÇÏ¿© shutdown()À» È£ÃâÇÏ¸é µÇ´Âµ¥ À̸¦ partial close¶ó ÇÑ´Ù.

¢º À̶§ ³×Æ®¿÷ ½Ã½ºÅÛÀº »ó´ë¹æ ¼­¹ö¿¡°Ô end-of-file ½ÅÈ£¸¦ Àü¼ÛÇÏ°í À̸¦ ¼ö½ÅÇÑ ¼­¹öµµ ¸¸ÀÏ º¸³¾ µ¥ÀÌÅÍ°¡ ¾øÀ¸¸é ÇØ´ç ¿¬°áÀ» Á¾·áÇÏ¸é µÈ´Ù.

¢º ÇÑÆí close() È£Ãâ½Ã ¹Ìó¸®µÈ ÆÐŶµéÀ» ó¸®ÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î, ÀÏÁ¤ÇÑ ½Ã°£À» ÁöÁ¤ÇØ ÁÖ°í ÀÌ ½Ã°£ µ¿¾È¸¸ ¹Ìó¸®µÈ ÆÐŶµéÀÌ Ã³¸®µÇ´Â °ÍÀ» ±â´Ù¸®´Â ¹æ¹ýµµ ÀÖ´Ù.

¢º À̸¦ À§ÇÏ¿©´Â close()¸¦ È£ÃâÇϱâ Àü¿¡ setsockopt()¸¦ È£ÃâÇÏ¿© ¼ÒÄÏ µ¿ÀÛÀÇ ¿É¼ÇÀ» ¹Ù²Ù¾î ÁÖ¾î¾ß ÇÑ´Ù(ÀÚ¼¼ÇÑ ³»¿ëÀº 5.2.1Àý¿¡¼­ ¼³¸í).

2.3.2 ºñ¿¬°áÇü Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷

¢ºUDP(ºñ¿¬°áÇü ¶Ç´Â µ¥ÀÌÅͱ׷¥) Ŭ¶óÀ̾ðÆ®µµ ¾Õ¿¡¼­ ¼³¸íÇÑ ¿¬°áÇü Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥°ú À¯»çÇÑ ÀýÂ÷·Î ±¸ÇöÇÒ ¼ö ÀÖ´Ù.

¢º ±×·¯³ª ºñ¿¬°áÇü ¼­ºñ½ºÀ̹ǷΠconnect() ½Ã½ºÅÛ È£ÃâÀÌ ÇÊ¿ä ¾ø°í Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö´Â ¼ÒÄÏ °³¼³ ÈÄ ¹Ù·Î µ¥ÀÌÅ͸¦ ¼Û¼ö½ÅÇÒ ¼ö ÀÖ´Ù.

±×¸² 2-10 UDP(ºñ¿¬°áÇü) ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ÀýÂ÷

¡¡

¢º ÇÑÆí ºñ¿¬°áÇü Åë½Å¿¡¼­´Â ¿¬°áÇü ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö°ú ´Þ¸®, ¼ÒÄÏÀÌ ¸ñÀûÁöº°·Î °³¼³µÇ¾î ÀÖ´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ÇϳªÀÇ ¼ÒÄÏÀ» ÅëÇÏ¿© ÀÓÀÇÀÇ ¸ñÀûÁö¸¦ ÇâÇÏ¿© IP ÆÐŶÀ» º¸³¾ ¼ö Àִµ¥ ÀÌ°ÍÀÌ ¹Ù·Î UDP¸¦ »ç¿ëÇÏ´Â ÃÖ´ëÀÇ ÀåÁ¡À̱⵵ ÇÏ´Ù.

¢º ±×·¯³ª ºñ¿¬°áÇüÀ¸·Î ¸¸µç ¼ÒÄÏÀ¸·Î ÆÐŶÀ» Àü¼ÛÇÒ ¶§¿¡´Â °¢ ÆÐŶ Àü¼Û½Ã¸¶´Ù ¸ñÀûÁöÀÇ IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£(Áï ¼ÒÄÏÁÖ¼Ò)¸¦ Ç×»ó ÇÔ¼ö ÀÎÀÚ·Î ÁÖ¾î¾ß ÇÑ´Ù.

¢º Ç¥ 2-2¿¡ ºñ¿¬°áÇü ¼ÒÄÏ¿¡¼­ »ç¿ëÇÏ´Â µ¥ÀÌÅÍ ¼Û¼ö½Å ÇÔ¼öÀÎ sendto()¿Í recvfrom()ÀÇ »ç¿ë¹ýÀ» Á¤¸®ÇÏ¿´´Ù.

¢º µ¥ÀÌÅÍ ¼Û½Å ÇÔ¼öÀÎ sendto()¿¡¼­ to ±¸Á¶Ã¼´Â µ¥ÀÌÅ͸¦ º¸³¾ »ó´ë¹æÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¸¦ °¡¸®Å°¸ç sendto()¸¦ È£ÃâÇϱâ Àü¿¡ toÀÇ ³»¿ëÀ» Á¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

¢º ÇÑÆí µ¥ÀÌÅÍ ¼ö½ÅÇÔ¼öÀÎ recvfrom()ÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é from ±¸Á¶Ã¼¿¡ ÇöÀç ¼ö½ÅµÈ ÆÐŶÀ» º¸³½ ¹ß½ÅÀÚÀÇ ¼ÒÄÏÁÖ¼Ò°¡ µé¾î ÀÖÀ¸¸ç µû¶ó¼­ ´©°¡ ÀÌ µ¥ÀÌÅ͸¦ Àü¼ÛÇÏ¿´´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù.

¢º ÀÌ µ¥ÀÌÅ͸¦ º¸³»¿Â ¹ß½ÅÀÚ¿¡°Ô µ¥ÀÌÅ͸¦ º¸³»·Á¸é from¿¡ µé¾î ÀÖ´Â ¼ÒÄÏÁÖ¼Ò¸¦ sendto()ÀÇ to·Î º¹»çÇÏ¿© »ç¿ëÇÏ¸é µÈ´Ù.

¹® ¹ý

ÀÎ ÀÚ

int sendto(int s, char* buf,

int length, int flags,

sockaddr* to, int tolen);

s ¼ÒÄϹøÈ£
buf Àü¼ÛÇÒ µ¥ÀÌÅÍ°¡ ÀúÀåµÈ ¹öÆÛ
length buf ¹öÆÛÀÇ Å©±â
flags º¸Åë 0
to ¸ñÀûÁöÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼
tolen to ¹öÆÛÀÇ Å©±â
int recvfrom(int s,

char* buf, int length,

int flags, sockaddr* from,

int* fromlen)

s ¼ÒÄϹøÈ£
buf ¼ö½Å µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¹öÆÛ
length buf ¹öÆÛÀÇ ±æÀÌ
flags º¸Åë 0
from ¹ß½ÅÀÚÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼
fromlen from ¹öÆÛÀÇ ±æÀÌ

Ç¥ 2-2 sendto()¿Í recvfrom() ÇÔ¼öÀÇ »ç¿ë¹ý

2.3.3 daytime Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥

¢º ¿©±â¼­´Â °£´ÜÇÑ TCP Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ÀÛ¼º ¿¹·Î, ÇöÀçÀÇ ³¯Â¥¿Í ½Ã°£À» ¾Ë·ÁÁÖ´Â daytime ¼­ºñ½º¸¦ ÀÌ¿ëÇϴ Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ mydaytime.c¸¦ ÀÛ¼ºÇÏ°Ú´Ù.

¢º ´ÙÀ½Àº mydaytime.c¸¦ ½ÇÇàÇÑ °á°úÀε¥ daytime ¼­ºñ½º¸¦ Á¦°øÇØ ÁÙ ÀÓÀÇÀÇ ¼­¹öÀÇ dotted decimal IP ÁÖ¼Ò¸¦ ¸í·É¹® ÀÎÀÚ·Î ÁÖ¾î¾ß ÇÑ´Ù.

¡¡

# mydaytime 203.252.65.3

Sun May 16 05:00:21 1997

#

¢º mydaytime.c¿¡¼­´Â »ç¿ëÇÒ ¼ÒÄÏÀ» ¾Æ·¡¿Í °°ÀÌ °³¼³Çϴµ¥ ÇÁ·ÎÅäÄÝ Ã¼°è·Î´Â ÀÎÅͳÝÀ», ¼­ºñ½º´Â ¿¬°áÇü(TCP)À» ÁöÁ¤ÇÏ°í ÀÖ´Ù.

s = socket(PF_INET, SOCK_STREAM, 0);

¡¡

¢º ´ÙÀ½¿¡´Â ¿¬°áÇÒ ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¸¦ ¸¸µé¾î¾ß Çϴµ¥ ÁÖ¼Ò Ã¼°è¸¦ ÀÎÅͳÝ(AF_INET)À¸·Î ÁöÁ¤ÇÑ´Ù.

¢º ¼­¹öÀÇ IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£¸¦ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ sever_addr¿¡ ±â·ÏÇÏ´Â °ÍÀ» ¾Æ·¡¿¡ º¸¿´´Ù.

¢º ¾Æ·¡¿¡¼­ inet_addr() ÇÔ¼ö´Â »ç¿ëÀÚ°¡ ¸í·É ÀÎÀÚ·Î ÀÔ·ÂÇÑ dotted decimal ÇüÅÂÀÇ IP ÁÖ¼Ò ¹®ÀÚ¿­ haddrÀ» (binary) IP ÁÖ¼Ò·Î º¯È¯ÇÏ´Â ÇÔ¼öÀÌ´Ù(2.2.3Àý ÂüÁ¶).

¢º ÇÑÆí Ç¥ÁØ ÀÎÅÍ³Ý ¼­ºñ½ºÀÎ daytime ¼­ºñ½º¸¦ ¹Þ±â À§Çؼ­´Â well_known Æ÷Æ®¹øÈ£·Î 13¹øÀ» ÁöÁ¤ÇÏ¿©¾ß ÇÑ´Ù.

struct sockaddr_in server_addr; /* ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */

haddr = argv[1];

server_addr.sin_family = AF_INET; /* ÁÖ¼Ò Ã¼°è ¼±Åà */

server_addr.sin_addr.s_addr = inet_addr(haddr); /* 32ºñÆ®ÀÇ IP ÁÖ¼Ò·Î º¯È¯ */

server_addr.sin_port = htonl(13); /* daytime ¼­ºñ½º Æ÷Æ®¹øÈ£ */

¢º ÀÌ»ó°ú °°ÀÌ ¼­¹öÀÇ ÁÖ¼Ò Á¤º¸¸¦ ¸ðµÎ server_addr ±¸Á¶Ã¼¿¡ ±â·ÏÇÑ ÈÄ ¼­¹ö¿¡ ¿¬°áÀ» ¿äûÇϱâ À§ÇØ connect() ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ È£ÃâÇϴµ¥ ¿¬°á¿äûÀÌ ¼ö¶ôµÈ °æ¿ì¿¡´Â 0ÀÌ ¸®ÅϵǸç, ±×·¸Áö ¾ÊÀº °æ¿ì¿¡´Â -1ÀÌ ¸®ÅϵȴÙ.

connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr));

¡¡

¢º¼­¹ö¿Í ¿¬°áµÈ ÈÄ, ¼­¹ö°¡ º¸³»¿À´Â ¹®ÀÚ¿­(³¯Â¥¿Í ½Ã°£)À» ¼ö½ÅÇϱâ À§ÇØ Å¬¶óÀ̾ðÆ®´Â read()¸¦ ¾Æ·¡¿Í °°ÀÌ È£ÃâÇÑ´Ù.

n = read(s, buf, BUF_LEN);

¡¡

¢º mydaytime.c Àüü ¸®½ºÆ®

2.3.4 echo Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥

¢º Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¡¹ÖÀÇ µÎ¹ø° ¿¹·Î echo ¼­ºñ½º¸¦ ½ÃÇèÇϴ Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ myecho.c¸¦ ¼Ò°³ÇÑ´Ù.

¢º Ç¥ÁØ ÀÎÅÍ³Ý ¼­ºñ½ºÀÎ echo´Â well-known Æ÷Æ® 7¹øÀ» ÅëÇØ À¯´Ð½º ÄÄÇ»ÅÍ°¡ Á¦°øÇÏ´Â ¼­ºñ½º·Î Ŭ¶óÀ̾ðÆ®°¡ Àü¼ÛÇÑ ¹®ÀÚ¿­À» ´Ù½Ã Ŭ¶óÀ̾ðÆ®·Î Àü¼ÛÇÑ´Ù.

¢º ´ÙÀ½Àº myecho.c¸¦ ½ÇÇàÇÑ °á°ú ¿¹ÀÌ´Ù.

# myecho 203.252.65.3

Input any string : Unix socket programming

Echoed string : Unix socket programming

#

¢º myecho.c ÇÁ·Î±×·¥µµ ¾Õ¿¡¼­ ¼³¸íÇÑ mydaytime.c¿Í °ÅÀÇ À¯»çÇÏ°Ô ÀÛ¼ºµÇ´Âµ¥ ÇÑ °¡Áö Â÷ÀÌÁ¡Àº mydaytime.c¿¡¼­´Â daytime ¼­ºñ½º¸¦ ÀÌ¿ëÇϱâ À§ÇØ Æ÷Æ® 13¹øÀ» »ç¿ëÇÏ¿´À¸³ª, myecho.c¿¡¼­´Â echo ¼­ºñ½º¸¦ ÀÌ¿ëÇØ¾ß ÇϹǷΠ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ server_addrÀÇ Æ÷Æ®¹øÈ£·Î ¾Æ·¡¿Í °°ÀÌ 7À» ¼±ÅÃÇØ¾ß ÇÑ´Ù.

server_addr.sin_port = htonl(7);

¡¡

¢º ÇÑÆí connect()¸¦ È£ÃâÇÑ ÈÄ ¼­¹ö¿Í ¿¬°áÀÌ ¿Ï·áµÇ¸é ¼­¹ö¿¡ Àü¼ÛÇÒ ¹®ÀÚ¿­À» Å°º¸µå¸¦ ÅëÇØ ¾Æ·¡¿Í °°ÀÌ ÀԷ¹޴´Ù.

fgets(buf, BUF_LEN, stdin);

¡¡

¢º À§¿¡¼­ fgets() ÇÔ¼ö´Â ½ºÆ®¸µ ¹®ÀÚ¿­À» ÀԷ¹޴ ÇÔ¼ö·Î ù¹ø° ÀÎÀÚ(buf)´Â ¹®ÀÚ¿­À» ÀúÀåÇÒ ¹öÆÛÀÌ´Ù.

¢º µÎ¹ø° ÀÎÀÚ´Â ¹öÆÛÀÇ Å©±â, ±×¸®°í ¼¼¹ø° ÀÎÀÚ´Â ÀÔ·Â ½ºÆ®¸² Æ÷ÀÎÅÍÀÌ´Ù.

¢º ÀÔ·Â ½ºÆ®¸² Æ÷ÀÎÅÍ·Î stdinÀ» ÁöÁ¤ÇÏ¿´´Âµ¥ stdinÀº FILE Æ÷ÀÎÅÍ Å¸ÀÔÀÇ Àü¿ªº¯¼ö·Î Ç¥ÁØ ÀÔ·Â ÆÄÀÏÀÎ Å°º¸µå¸¦ ¶æÇÑ´Ù.

¢º fgets()·Î Å°º¸µå¿¡¼­ ÀԷ¹ÞÀº ¹®ÀÚ¿­Àº write() ½Ã½ºÅÛ ÄÝÀ» ÀÌ¿ëÇØ ¼­¹ö·Î Àü¼ÛÇÏ°í ¼­¹ö°¡ echo½ÃÄÑÁØ ¹®ÀÚ¿­Àº read() ½Ã½ºÅÛ ÄÝ·Î ¼ö½ÅÇÑ´Ù.

¢ºmyecho.c Àüü ¸®½ºÆ®


ÇöÀç°­Á : UNIX BSD ¼ÒÄÏ ½Ã½ºÅÛ ÄÝ ÀÌÀü: 2.2 ÀÎÅÍ³Ý ÁÖ¼Ò º¯È¯ ´ÙÀ½: 2.4 ¼­¹ö ÇÁ·Î±×·¥ ÀÛ¼º ÀýÂ÷