Remote procedure call
ÃÑ ÆäÀÌÁö ¼ö : 3027

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>Network_Programing>Documents>RPC

Replace original file
Rename if it already exist

¼Ò°³

Remote prodecure call (ÀÌÇÏ RPC)´Â ´Ù¸¥ ÁÖ¼Ò°ø°£¿¡¼­ ¼­ºê·çƾÀ̳ª ÇÁ·Î½ÃÁ®¸¦ ½ÇÇà½Ã۱âÀ§ÇÑ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹Ö ±â¼úÀÌ´Ù. ÀÌ ±â¼úÀ» ÀÌ¿ëÇϸé ÇÁ·Î±×·¡¸Ó´Â ¸¶Ä¡ ·ÎÄÿ¡¼­ ÇÁ·Î±×·¥À» µ¹¸®´Â °Í°ú °°Àº °á°ú¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.

ÀÌ·¸°Ô ¿©·¯´ëÀÇ ÄÄÇ»ÅÍ¿¡ ÇÁ·Î½ÃÁ®¸¦ ºÐ»êÇϰí, °á°ú¸¦ ÃëÇÕÇÏ´Â ¸ðµ¨Àº ºÐ»ê½Ã½ºÅÛÀ» À§ÇÑ ÈǸ¢ÇÑ ´ë¾ÈÀÌ µÉ ¼ö ÀÖ´Ù.

¿©±â¿¡¼­´Â RPC ÇÁ·Î±×·¡¹Ö°ú °ü·ÃµÈ ³»¿ëÀ» ´Ù·ê °ÍÀÌ´Ù.

Ŭ¶óÀ̾ðÆ®/¼­¹ö ¸ðµ¨

RPC´Â ÀüÇüÀûÀΠŬ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸¥´Ù. ¼­ºñ½º¸¦ ¿äûÇÏ´Â ÂÊÀÌ Å¬¶óÀÌ¾ðÆ®°¡ µÇ°í, ¼­ºñ½º¸¦ ¹Þ¾Æ¼­ ÇÁ·Î½ÃÀú°¡ µÈ´Ù. RPC Ŭ¶óÀ̾ðÆ®/¼­¹ö ¸ðµ¨À» ÀÌÇØÇϱâ À§Çؼ­´Â ´ÙÀ½ ¿ë¾îµéÀ» ¼÷ÁöÇØµÑ Çʿ䰡 ÀÖ´Ù.

  • caller : ¼­ºê·çƾÀ» È£ÃâÇÏ´Â ÇÁ·Î±×·¥
  • callee : caller¿¡ ÀÇÇØ¼­ È£ÃâµÇ´Â ¼­ºê·çƾ ȤÀº ÇÁ·Î½ÃÁ®
  • client : ³×Æ®¿öÅ© ¼­¹ö·Î ¿¬°áÇØ¼­ ¿äûÀ» ³¯¸®´Â ÇÁ·Î±×·¥
  • Server : ClientÀÇ ¿¬°áÀ» ±â´Ù¸®´Ù°¡ ¿äûÀÌ µé¾î¿À¸é ¼­ºñ½º¸¦ Á¦°øÇÏ´Â ÇÁ·Î±×·¥

RPC ¸ÞÄ¿´ÏÁò

¼­ºê/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸£±â ¶§¹®¿¡, µ¥ÀÌÅÍ Åë½ÅÀ» À§ÇÑ ¸ÞÄ¿´ÏÁòÀº ´Ü¼øÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ¼­ºñ½º¸¦ ¿äûÇÏ¸é ¼­¹ö¿¡¼­ ÇÁ·Î½ÃÁ®¸¦ È£ÃâÇØ¼­ ó¸®ÇÏ°í ¸®ÅϰªÀ» µÇµ¹·ÁÁÖ´Â ¹æ½ÄÀÌ´Ù.

±×·¯³ª ¿©±â¿¡´Â ¸î°¡Áö °í·ÁÇØ¾ßÇÒ »çÇ×ÀÌ ÀÖ´Ù.
  • caller°ú callee´Â ¼­·Î ´Ù¸¥ ½Ã½ºÅÛÀÏ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì µ¥ÀÌÅÍ Å¸ÀÔÀÇ Ã³¸®µî¿¡ ½Å°æÀ» ½áÁÖ¾î¾ß ÇÑ´Ù. intel ¸Ó½Å¿¡¼­ int 1ÀÌ, sparc ¸Ó½Å¿¡¼­´Â ÀüÇô ´Ù¸£°Ô ÇØ¼®µÈ´Ù. ÀÌ¿Í °ü·ÃµÈ ³»¿ëÀº endian ¹®¼­¸¦ Àо±â ¹Ù¶õ´Ù.
  • ÀϹÝÀûÀÎ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÇ °æ¿ì ÇÁ·Î½ÃÁ® ±â¹ÝÀÌ ¾Æ´Ñ µ¥ÀÌÅÍ ±â¹ÝÀÌ´Ù. ¼­·Î ¾à¼ÓµÈ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Â °ÍÀÌ´Ù. RPC´Â ÇÁ·Î½ÃÁ® ±â¹ÝÀ̹ǷÎ, ÁÖ°í ¹Þ´Â ÀÎÀÚ¿Í ÀÎÀÚÀÇ µ¥ÀÌÅÍŸÀÔÀ» ¸íÈ®È÷ ¸í½ÃÇØÁà¾ßÇÒ Çʿ䰡 ÀÖ´Ù.

ÀÌ´Â ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ® »çÀÌ¿¡¼­ Àü¼ÛµÇ´Â µ¥ÀÌÅ͵鿡 ´ëÇØ¼­ ŸÀÔ¿¡ ¸Â°Ô ÀçÇØ¼®ÇÏ°í º¯È¯ÇØÁÖ´Â ÀåÄ¡°¡ ÇÊ¿äÇÔÀ» ÀǹÌÇÑ´Ù. ÀÌ·¯ÇÑ ÀåÄ¡´Â Ç¥ÁØÀûÀ¸·Î Á¦°øÇÏ´Â °ÍÀÌ Àִµ¥, ±× Áß Çϳª°¡ ONC RPC¿¡¼­ ÀÌ¿ëÇÏ´Â eXternal Data Representaion, XDRÀÌ´Ù. XDRÀº CÇÔ¼ö¿Í ¸ÅÅ©·ÎÀÇ ¸ðÀ½À¸·Î ±¸¼ºµÇ¾î Àִµ¥, ÁÖ°í ¹ÞÀ» µ¥ÀÌÅ͸¦ °¢ ¸Ó½Å¿¡ ¸Âµµ·Ï Ç¥ÁØÀûÀÎ ¹æ¹ýÀ¸·Î ÀçÇØ¼®ÇÏ´Â ÀÏÀ» ÇÑ´Ù. XDRÀº µ¥ÀÌÅ͸¦ ÀçÇØ¼®Çϱâ À§ÇÑ int, float, string°ú °°Àº ¿ø½Ã µ¥ÀÌÅÍ Å¸ÀÔ°ú, ¸î°³ÀÇ ·¹ÄÚµå·Î ÀÌ·ç¾îÁø º¹ÀâÇÑ µ¥ÀÌÅ͵é - ¸®½ºÆ®, ±¸Á¶Ã¼ °°Àº - µéÀ» ÀçÇØ¼®Çϱâ À§ÇÑ ÀÚ·áŸÀÔÀ» °¡Áö°í ÀÖ´Ù.

RPC µ¥ÀÌÅÍ È帧

RPC.png
  1. Client µ¥ÀÌÅÍ´Â XDR ÇÊÅ͸¦ Åë°úÇØ¼­ ÀÎÄÚµùµÈ ÈÄ Àü´ÞµÈ´Ù.
  2. XDR ÀÎÄÚµùµÈ µ¥ÀÌÅÍ´Â ³×Æ®¿öÅ©¸¦ °¡·ÎÁú·¯¼­ ¿ø°ÝÁö È£½ºÆ®·Î Àü´ÞµÈ´Ù.
  3. µ¥ÀÌÅ͸¦ ¹ÞÀº ¼­¹ö´Â XDR ÇÊÅ͸¦ ÅëÇØ¼­ µðÄÚµùÇÑ´Ù.
  4. µðÄÚµùµÈ µ¥ÀÌÅ͸¦ ó¸®ÇÏ°í °á°ú µ¥ÀÌÅ͸¦ XDR ÇÊÅ͸¦ ÅëÇØ¼­ ÀÎÄÚµùÇÑ´Ù.
  5. ÀÎÄÚµùµÈ XDR µ¥ÀÌÅͰ¡ ³×Æ®¿öÅ©¸¦ °¡·ÎÁú·¯¼­ Ŭ¶óÀÌ¾ðÆ®¿¡ Àü´ÞµÈ´Ù.
  6. Ŭ¶óÀÌ¾ðÆ®´Â XDR µðÄÚµùÀ»ÇÏ°í °á°ú¸¦ ó¸®ÇÑ´Ù.

³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °³·Ð

RPC¸¦ ÅëÇØ¼­ ¾î¶»°Ô µ¥ÀÌÅͰ¡ È帣´ÂÁö ¾Ë¾Æº¸¾Ò´Ù. ÀÌÁ¦ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °üÁ¡¿¡¼­ ÀÌ °úÁ¤À» »ìÆìº¸±â·Î ÇÏÀÚ.

³×Æ®¿öÅ© »ó¿¡¼­ µ¥ÀÌÅͰ¡ Àü¼ÛµÇ±â À§Çؼ­´Â ´ÙÀ½°ú °°Àº 5°³ÀÇ ¿ä¼ÒµéÀÌ ÇÊ¿äÇÏ´Ù.
  • protocol
  • local-address
  • local-process
  • foreign-address
  • foregn-process

protocolÀº µÎ°³ÀÇ È£½ºÆ® »çÀÌÀÇ µ¥ÀÌÅÍ Àü¼Û ¸ÅÄ¿´ÏÁòÀ¸·Î, º¸Åë TCP¿Í UDP¸¦ »ç¿ëÇÑ´Ù. ÇÑÂÊ È£½ºÆ®´Â ´Ù¸¥ÂÊ È£½ºÆ®¿¡ µ¥ÀÌÅ͸¦ Àü¼ÛÇϱâ À§Çؼ­ ³×Æ®¿öÅ© »ó¿¡¼­ÀÇ È£½ºÆ®ÀÇ À§Ä¡¸¦ ¾Ë°í ÀÖ¾î¾ß ÇÑ´Ù. À̸¦ À§Çؼ­ local-address/process, foregn-addresss/process°¡ ÇÊ¿äÇÏ´Ù.

address·Î IPÁÖ¼Ò°¡ »ç¿ëµÇ¸ç, À̸¦ ÅëÇØ¼­ ÄÄÇ»ÅÍÀÇ À§Ä¡¸¦ ½Äº°ÇÑ´Ù´Â °ÍÀº ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ³²Àº ¹®Á¦´Â process¸¦ ¾î¶»°Ô ½Äº°ÇÒ ¼ö ÀÖ´À³Ä ÇÏ´Â °ÍÀÌ´Ù. ÄÄÇ»ÅÍ¿¡´Â º¸Åë ¼ö½Ê°³¿¡¼­ ¼ö¹é°³ÀÇ process°¡ ¶° Àִµ¥, ÀÌÁß ÀÛ¾÷À» ó¸®ÇÒ process·Î µ¥ÀÌÅ͸¦ º¸³¾ ¼ö ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ ÇÁ·Î¼¼½ºÀÇ ½Äº°Àº port¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù. ³×Æ®¿öÅ© ÇÁ·Î±×·¥Àº ½ÇÇàµÉ¶§, ÀÚ½ÅÀÌ »ç¿ëÇÒ PORT ¹øÈ£¸¦ ¿äûÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ Port¹øÈ£¸¦ ÅëÇØ¼­ ¾î¶² ÇÁ·Î¼¼½º·Î µ¥ÀÌÅͰ¡ Àü´ÞµÉÁö¸¦ ¸íÈ®È÷ ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é FTP ¼­ºñ½º¸¦ À§ÇÑ Æ÷Æ®´Â 21¹øÀ̰í, ¾î¶² ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ¾î¼­ 21¹ø Æ÷Æ®¸¦ ÇÒ´ç ¹Þ¾Ò´Ù¸é, FTP¿Í °ü·ÃµÈ µ¥ÀÌÅÍ´Â ÀÌ ÇÁ·Î¼¼½º¿¡°Ô Àü´ÞÀÌ µÈ´Ù.

RPC Call Binding

À̻󿡼­ PRC¸¦ ÀÌ¿ëÇÑ ÇÁ·Î½ÃÁ® ±â¹ÝÀÇ ÇÁ·Î±×·¥µµ ³×Æ®¿öÅ©¸¦ °ÅÃÄ¾ß ÇÔÀ¸·Î PORT ¹øÈ£°¡ ÇÊ¿äÇÔÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ´ëÇ¥ÀûÀÎ Port binding ÇÁ·Î±×·¥ÀÌ ONC RPC¿¡¼­ »ç¿ëÇÏ´Â portmapÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº RPC ÇÁ·Î±×·¥¿¡ Æ÷Æ®¹øÈ£¸¦ ÇÒ´çÇØ ÁØ´Ù. ÃÖÁ¾ÀûÀ¸·Î RPC ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ³×Æ®¿öÅ©¸¦ °¡·ÎÁö¸£°Ô µÈ´Ù.

flow.png

ÇÁ·ÎÅäÄÝ ÄÄÆÄÀÏ·¯

ÀÌ»ó RPC¿¡ ´ëÇØ¼­ °£´ÜÈ÷ ¾Ë¾Æº¸¾Ò´Âµ¥, ¿¹»ó°ú´Â ´Þ¸® ²Ï³ª º¹ÀâÇØ º¸Àδٴ ´À³¦À» ¹Þ¾ÒÀ» °ÍÀÌ´Ù. ÁÖ°í ¹ÞÀ» µ¥ÀÌÅÍÀÇ Å¸ÀÔÀ» ¸í½Ã¸¦ ÇØÁÖ¾î¾ßÇϰí, Æ÷Æ®¸¦ bind½ÃÄÑÁÖ±â À§Çؼ­ portmapÀ» ½ÇÇà½ÃÄÑÁà¾ß ÇÑ´Ù. ƯÈ÷ ÇÁ·ÎÅäÄÝÀ̶ó°í ÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅÍ¿Í µ¥ÀÌÅÍ Å¸ÀÔÀ» XDR Çü½Ä¿¡ ¸Âµµ·Ï ¸¸µé¾î¾ß Çϴµ¥ ºÎ´ãÀÌ µÉ °ÍÀÌ´Ù.

±×·¯³ª °ÆÁ¤ÇÒ °Í ¾ø´Ù. ÀÌ·¯ÇÑ ÇÁ·ÎÅäÄÝÀ» ÀÚµ¿À¸·Î ¸¸µé¾îÁÖ´Â RPC °³¹ß ÇÁ·Î±×·¥ÀÌ Àֱ⠶§¹®ÀÌ´Ù. 'rpcgenÀ̶ó°í ºÒ¸®¿ì´Â ÇÁ·ÎÅäÄÝ ÄÄÆÄÀÏ·¯¸¦ ÀÌ¿ëÇϸé, ÇÁ·Î½ÃÀú¿¡ Àü´ÞÇÒ µ¥ÀÌÅÍ ÀÎÀÚÀÇ °¹¼ö¿Í °¢°¢ÀÇ Å¸ÀÔÀ» Á¤ÇÏ´Â Á¤µµ·Î °£´ÜÇÏ°Ô ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ±×¸®°í XDR ÇÊÅ͸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. °³¹ßÀÚ´Â ÇÁ·Î½ÃÀú¸¸ ¸¸µé¾îÁÖ¸é µÈ´Ù.

ÁÖ¾îÁø ¼ýÀڵ鿡 ´ëÇØ¼­ Æò±Õ°ªÀ» ±¸ÇØÁÖ´Â rpc ¼­ºñ½º¸¦ ±¸ÇöÇØ º¸µµ·Ï ÇÏÀÚ. ¿ì¼± µ¥ÀÌÅÍ¿Í µ¥ÀÌÅÍÀÇ Å¸ÀÔÀ» Á¤ÀÇÇÑ ÆÄÀÏÀ» ¸¸µé°í À̰ÍÀ» rpcgenÀ¸·Î ÄÄÆÄÀÏ ½ÃŲ´Ù. ÀÌ ÆÄÀÏÀÇ À̸§Àº avg.x¶ó°í ÇÏÀÚ. avg.x ´Â ´ÙÀ½°ú °°Àº ³»¿ëÀ» ´ã°í ÀÖ´Ù.
/* 
 * ÇÁ·Î½ÃÁ®´Â doubleÇüÀÇ ¹è¿­µ¥ÀÌÅ͸¦ ¹Þ´Âµ¥, ¹ÞÀ» ¼ö ÀÖ´Â ÃÖ´ë ¹è¿­ÀÇ Å©±â´Â 
 * 200À¸·Î Á¦ÇÑÇÑ´Ù. 
 * ¸®ÅϰªÀº double ÇüÀÌ´Ù. 
 */ 
const MAXAVGSIZE  = 200; 
 
// ÀԷµ¥ÀÌÅÍÀÇ Å¸ÀÔ°ú Å©±â¸¦ Á¤ÀÇ ÇÑ´Ù. 
struct input_data { 
  double input_data<200>; 
}; 
 
typedef struct input_data input_data; 
 
// ÇÁ·Î±×·¥ÀÇ À̸§°ú ¹öÀüÀ» Á¤ÀÇ ÇÑ´Ù. 
program AVERAGEPROG { 
    version AVERAGEVERS { 
        double AVERAGE(input_data) = 1; 
    } = 1; 
} = 22855; 
 
ÀÌÁ¦ ÄÄÆÄÀÏ ÇÏÀÚ.
# rpcgen avg.x 
 

rpcgenÀ» ¼öÇàÇÏ¸é ¾Æ·¡¿Í °°Àº 3°³ÀÇ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.
  1. avg_clnt.c : Ŭ¶óÀÌ¾ðÆ® caller ÇÁ·Î¼¼½º¸¦ À§ÇÑ stud ÇÁ·Î±×·¥
  2. avg_svc.c : ¼­¹ö callee ÇÁ·Î¼¼½º¸¦ À§ÇÑ main ÇÁ·Î±×·¥
  3. avg_xdr.c : ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ® ¾çÂÊ¿¡¼­ »ç¿ëµÉ XDR ·çƾÀÌ µé¾îÀÖ´Ù.
  4. avg.h : XDR°ú °¢Á¾ ÇÔ¼öµéÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

ÀÌÁ¦ ¼­¹ö ¼Ò½ºÄڵ带 ´ã°í ÀÖ´Â avg_svc.c¸¦ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. average_1°ú average_1_svcÇÔ¼ö¸¦ Á¤ÀÇÇØ ÁÖ¸é µÈ´Ù. ÀÎÀÚ·Î ³Ñ¾î¿Â µ¥ÀÌÅÍ´Â XDR ÇÊÅÍ¿¡ ÀÇÇØ¼­ ¸®½ºÆ®ÇüÅ·Π³Ñ¾î¿Â´Ù. ÀÌ ¸®½ºÆ®ÀÇ °ªÀ» ¸ðµÎ ´õÇÑ´ÙÀ½¿¡, ¸®½ºÆ®ÀÇ ±æÀÌ ¸¸Å­ ³ª´²ÁØ °á°ú °ªÀ» ¸®ÅÏÇÏ¸é µÈ´Ù.
static double sum_avg; 
 
double * average_1(input_data *input,  
  CLIENT *client) { 
 
  double *dp = input->input_data.input_data_val; 
  u_int i; 
  sum_avg = 0; 
  for(i=1;i<=input->input_data.input_data_len;i++) { 
    sum_avg = sum_avg + *dp; dp++; 
  } 
  sum_avg = sum_avg / 
    input->input_data.input_data_len; 
  return(&sum_avg); 
} 
 
double * average_1_svc(input_data *input,  
    struct svc_req *svc) { 
  CLIENT *client; 
  return(average_1(input,client)); 
} 
 

ÀÌÁ¦ Ŭ¶óÀÌ¾ðÆ® ÄÚµåÀÎ avg_clnt.c¿¡ Äڵ带 Ãß°¡ÇÑ´Ù.
 
void 
averageprog_1( char* host, int argc, char *argv[]) 
{ 
   CLIENT *clnt; 
   double  *result_1, *dp, f; 
      char *endptr; 
      int i; 
   input_data  average_1_arg; 
   average_1_arg.input_data.input_data_val =  
     (double*) malloc(MAXAVGSIZE*sizeof(double)); 
 
   dp = average_1_arg.input_data.input_data_val; 
   average_1_arg.input_data.input_data_len = argc - 2; 
   for (i=1;i<=(argc - 2);i++)  
   { 
        f = strtod(argv[i+1],&endptr); 
        printf("value   = %e\n",f); 
        *dp = f; 
        dp++; 
    } 
   clnt = clnt_create(host, AVERAGEPROG, AVERAGEVERS, "udp"); 
   if (clnt == NULL)  
   { 
      clnt_pcreateerror(host); 
      exit(1); 
   } 
   result_1 = average_1(&average_1_arg, clnt); 
   if (result_1 == NULL)  
   { 
      clnt_perror(clnt, "call failed:"); 
   } 
   clnt_destroy( clnt ); 
      printf("average = %e\n",*result_1); 
} 
 
main( int argc, char* argv[] ) 
{ 
   char *host; 
 
   if(argc < 3)  
   { 
     printf( 
      "usage: %s server_host value ...\n", 
      argv[0]); 
      exit(1); 
   } 
   if(argc > MAXAVGSIZE + 2)  
   { 
      printf("Two many input values\n"); 
      exit(2); 
   } 
   host = argv[1]; 
   averageprog_1( host, argc, argv); 
} 
 

Á»´õ È®À强ÀÖ´Â Äڵ带 ¿øÇÑ´Ù¸é, progen À¸·Î ¸¸µé¾îÁø ÄÚµåµéÀ» º¯°æÇÏÁö ¸»°í Ãß°¡µÇ´Â ÇÔ¼öµéÀ» º°µµ¿¡ ÄÚµå·Î ºÐ¸®ÇÏ´Â°Ô ÁÁÀ» °ÍÀÌ´Ù.

´ÙÀ½Àº makefileÀÌ´Ù.
BIN =  avg_clnt avg_svc 
GEN = avg_clnt.c avg_svc.c avg_xdr.c avg.h 
RPCCOM = rpcgen 
CC = gcc 
 
all: $(BIN) 
 
avg_clnt: avg_clnt.o avg_xdr.o 
    $(CC) -o $@ avg_clnt.o avg_xdr.o 
 
avg_clnt.o: avg_clnt.c avg.h 
    $(CC) -g avg_clnt.c -c 
 
avg_svc: avg_svc.o avg_xdr.o 
    $(CC) -o $@ avg_svc.o avg_xdr.o 
 
avg_proc.o: avg_proc.c avg.h 
 

portmapper

ÀÌÁ¦ ¸¸µé¾îÁø rpc ÀÀ¿ë ÇÁ·Î±×·¥À» Å×½ºÆ® ÇØº¸±â·Î ÇÏÀÚ. ½±°Ô Å×½ºÆ® Çϱâ À§Çؼ­ ·ÎÄÃÄÄÇ»ÅÍ¿¡¼­ Ŭ¶óÀ̾ðÆ®/¼­¹ö ȯ°æÀ» ±¸ÃàÇÏ´Â °É·Î ÇϰڴÙ.

À§¿¡¼­ ¾ð±ÞÇßµíÀÌ, rpc ÀÀ¿ëÀ» ÀÌ¿ëÇϱâ À§Çؼ­´Â ÇÁ·Î±×·¥°ú Æ÷Æ®¸¦ ¿¬°á½ÃÄÑÁÖ´Â portmapper ÇÁ·Î±×·¥ÀÌ ¿ì¼±½ÇÇàµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. rpcinfo¸¦ ÀÌ¿ëÇϸé portmapperÀÌ ½ÇÇàµÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
$ rpcinfo -p localhost 
program    vers   proto    port 
100000        2     tcp     111   portmapper 
100000        2     udp     111   portmapper 
 
¸¸¾à ¿¡·¯°¡ ¶³¾îÁø´Ù¸é portmap(8) ÇÁ·Î±×·¥ÀÌ ¶°ÀÖ´ÂÁö È®ÀÎÇϰí, ¶ç¿öÁÖµµ·Ï ÇÑ´Ù. portmap¸¦ ·çÆ®±ÇÇÑÀ¸·Î ½ÇÇà½ÃÄÑ¾ß ÇÑ´Ù. ÀÌÁ¦ avg_svc¸¦ ½ÇÇà½Ã۰í rpcinfo ·Î ´Ù½Ã È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.
$ rpcinfo -p localhost 
program    vers   proto    port 
100000        2     tcp     111   portmapper 
100000        2     udp     111   portmapper 
 22855        1     udp   35621    
 22855        1     tcp   56094    
 
22855¸¦ ´«¿©°Ü º¸±â ¹Ù¶õ´Ù. ÀÌ °ªÀº avg.x¿¡ Á¤ÀÇµÈ °ªÀ¸·Î ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ´Ù. 1Àº ÇÁ·Î±×·¥ÀÇ ¹öÀü¹øÈ£´Ù. 100000 ¹ø ÇÁ·Î±×·¥ÀÇ °æ¿ì portmapperÀ̶ó°í À̸§ÀÌ ³ª¿À´Âµ¥, ¿ì¸®°¡ ½ÇÇà½ÃŲ rpc ÇÁ·Î±×·¥Àº ÇÁ·Î±×·¥À̸§ÀÌ ³ª¿ÀÁö ¾ÊÀ½À» ¾Ë ¼ö ÀÖ´Ù. ÀÌ´Â 22855 ÇÁ·Î±×·¥¿¡ ´ëÇÑ RPC ¼­ºñ½º¸íÀÌ µî·ÏµÇ¾î ÀÖÁö ¾Ê±â ¶§¹®ÀÌ´Ù. RPC ¼­ºñ½º¸íÀº /etc/rpc¿¡ µî·ÏµÇ¾î ÀÖ´Ù. ¾Æ·¡¿Í °°ÀÌ 22855 ÇÁ·Î±×·¥À» RPC ¼­ºñ½º¿¡ µî·ÏÇϵµ·Ï ÇÏÀÚ.
... 
avg             22855 
portmapper      100000  portmap sunrpc 
rstatd          100001  rstat rstat_svc rup perfmeter 
rusersd         100002  rusers 
nfs             100003  nfsprog 
ypserv          100004  ypprog 
... 
 
´Ù½Ã rpcinfo·Î È®ÀÎÇØ º¸¸é À̸§ÀÌ ÇÁ·Î±×·¥ ¹øÈ£¿¡ ´ëÀÀµÇ´Â À̸§ÀÌ Ãâ·ÂµÇ´Â°É º¼ ¼ö ÀÖ´Ù.
$ rpcinfo -p localhost 
program    vers   proto    port 
100000        2     tcp     111   portmapper 
100000        2     udp     111   portmapper 
 22855        1     udp   35621   avg  
 22855        1     tcp   56094   avg 
 

ÀÌÁ¦ RPC Ŭ¶óÀÌ¾ðÆ®¸¦ ÀÌ¿ëÇØ¼­ avg ¼­ºñ½º¸¦ Å×½ºÆ®Çغ¸µµ·Ï ÇÏÀÚ. ¿ì¸®°¡ ½ÇÇà½ÃŲ RPC Ŭ¶óÀÌ¾ðÆ®´Â 111¹ø¿¡ ¿¬°áÇØ¼­ portmapper·Î ºÎÅÍ 22855 ÇÁ·Î±×·¥À» À§ÇÑ Æ÷Æ®¹øÈ£¸¦ ¾ò¾î¿À°í ¿©±â¿¡ ¿¬°áÇØ¼­ ¼­ºñ½º¸¦ ¿äûÇÏ°Ô µÈ´Ù.
$ ./avg_clnt localhost $RANDOM $RANDOM $RANDOM 
value   = 2.716100e+04 
value   = 2.341800e+04 
value   = 1.599100e+04 
average = 2.219000e+04