|
ÃÑ ÆäÀÌÁö ¼ö : 3027
![]()
|
ÇöÀçÀ§Ä¡ : ¹Ì´Ï»çÀÌÆ®>Network_Programing>Documents>RPC ¼Ò°³
Remote prodecure call (ÀÌÇÏ RPC)´Â ´Ù¸¥ ÁÖ¼Ò°ø°£¿¡¼ ¼ºê·çƾÀ̳ª ÇÁ·Î½ÃÁ®¸¦ ½ÇÇà½Ã۱âÀ§ÇÑ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹Ö ±â¼úÀÌ´Ù. ÀÌ ±â¼úÀ» ÀÌ¿ëÇϸé ÇÁ·Î±×·¡¸Ó´Â ¸¶Ä¡ ·ÎÄÿ¡¼ ÇÁ·Î±×·¥À» µ¹¸®´Â °Í°ú °°Àº °á°ú¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
ÀÌ·¸°Ô ¿©·¯´ëÀÇ ÄÄÇ»ÅÍ¿¡ ÇÁ·Î½ÃÁ®¸¦ ºÐ»êÇϰí, °á°ú¸¦ ÃëÇÕÇÏ´Â ¸ðµ¨Àº ºÐ»ê½Ã½ºÅÛÀ» À§ÇÑ ÈǸ¢ÇÑ ´ë¾ÈÀÌ µÉ ¼ö ÀÖ´Ù.
¿©±â¿¡¼´Â RPC ÇÁ·Î±×·¡¹Ö°ú °ü·ÃµÈ ³»¿ëÀ» ´Ù·ê °ÍÀÌ´Ù. Ŭ¶óÀ̾ðÆ®/¼¹ö ¸ðµ¨
RPC´Â ÀüÇüÀûÀΠŬ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸¥´Ù. ¼ºñ½º¸¦ ¿äûÇÏ´Â ÂÊÀÌ Å¬¶óÀÌ¾ðÆ®°¡ µÇ°í, ¼ºñ½º¸¦ ¹Þ¾Æ¼ ÇÁ·Î½ÃÀú°¡ µÈ´Ù. RPC Ŭ¶óÀ̾ðÆ®/¼¹ö ¸ðµ¨À» ÀÌÇØÇϱâ À§Çؼ´Â ´ÙÀ½ ¿ë¾îµéÀ» ¼÷ÁöÇØµÑ Çʿ䰡 ÀÖ´Ù.
RPC ¸ÞÄ¿´ÏÁò
¼ºê/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸£±â ¶§¹®¿¡, µ¥ÀÌÅÍ Åë½ÅÀ» À§ÇÑ ¸ÞÄ¿´ÏÁòÀº ´Ü¼øÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. Ŭ¶óÀÌ¾ðÆ®¿¡¼ ¼ºñ½º¸¦ ¿äûÇÏ¸é ¼¹ö¿¡¼ ÇÁ·Î½ÃÁ®¸¦ È£ÃâÇØ¼ ó¸®ÇÏ°í ¸®ÅϰªÀ» µÇµ¹·ÁÁÖ´Â ¹æ½ÄÀÌ´Ù.
±×·¯³ª ¿©±â¿¡´Â ¸î°¡Áö °í·ÁÇØ¾ßÇÒ »çÇ×ÀÌ ÀÖ´Ù.
RPC µ¥ÀÌÅÍ È帧![]()
³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °³·Ð
RPC¸¦ ÅëÇØ¼ ¾î¶»°Ô µ¥ÀÌÅͰ¡ È帣´ÂÁö ¾Ë¾Æº¸¾Ò´Ù. ÀÌÁ¦ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °üÁ¡¿¡¼ ÀÌ °úÁ¤À» »ìÆìº¸±â·Î ÇÏÀÚ.
³×Æ®¿öÅ© »ó¿¡¼ µ¥ÀÌÅͰ¡ Àü¼ÛµÇ±â À§Çؼ´Â ´ÙÀ½°ú °°Àº 5°³ÀÇ ¿ä¼ÒµéÀÌ ÇÊ¿äÇÏ´Ù.
address·Î IPÁÖ¼Ò°¡ »ç¿ëµÇ¸ç, À̸¦ ÅëÇØ¼ ÄÄÇ»ÅÍÀÇ À§Ä¡¸¦ ½Äº°ÇÑ´Ù´Â °ÍÀº ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ³²Àº ¹®Á¦´Â process¸¦ ¾î¶»°Ô ½Äº°ÇÒ ¼ö ÀÖ´À³Ä ÇÏ´Â °ÍÀÌ´Ù. ÄÄÇ»ÅÍ¿¡´Â º¸Åë ¼ö½Ê°³¿¡¼ ¼ö¹é°³ÀÇ process°¡ ¶° Àִµ¥, ÀÌÁß ÀÛ¾÷À» ó¸®ÇÒ process·Î µ¥ÀÌÅ͸¦ º¸³¾ ¼ö ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ ÇÁ·Î¼¼½ºÀÇ ½Äº°Àº port¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. ³×Æ®¿öÅ© ÇÁ·Î±×·¥Àº ½ÇÇàµÉ¶§, ÀÚ½ÅÀÌ »ç¿ëÇÒ PORT ¹øÈ£¸¦ ¿äûÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ Port¹øÈ£¸¦ ÅëÇØ¼ ¾î¶² ÇÁ·Î¼¼½º·Î µ¥ÀÌÅͰ¡ Àü´ÞµÉÁö¸¦ ¸íÈ®È÷ ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é FTP ¼ºñ½º¸¦ À§ÇÑ Æ÷Æ®´Â 21¹øÀ̰í, ¾î¶² ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ¾î¼ 21¹ø Æ÷Æ®¸¦ ÇÒ´ç ¹Þ¾Ò´Ù¸é, FTP¿Í °ü·ÃµÈ µ¥ÀÌÅÍ´Â ÀÌ ÇÁ·Î¼¼½º¿¡°Ô Àü´ÞÀÌ µÈ´Ù. RPC Call Binding
À̻󿡼 PRC¸¦ ÀÌ¿ëÇÑ ÇÁ·Î½ÃÁ® ±â¹ÝÀÇ ÇÁ·Î±×·¥µµ ³×Æ®¿öÅ©¸¦ °ÅÃÄ¾ß ÇÔÀ¸·Î PORT ¹øÈ£°¡ ÇÊ¿äÇÔÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ´ëÇ¥ÀûÀÎ Port binding ÇÁ·Î±×·¥ÀÌ ONC RPC¿¡¼ »ç¿ëÇÏ´Â portmapÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº RPC ÇÁ·Î±×·¥¿¡ Æ÷Æ®¹øÈ£¸¦ ÇÒ´çÇØ ÁØ´Ù. ÃÖÁ¾ÀûÀ¸·Î RPC ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ³×Æ®¿öÅ©¸¦ °¡·ÎÁö¸£°Ô µÈ´Ù. ![]() ÇÁ·ÎÅäÄÝ ÄÄÆÄÀÏ·¯
ÀÌ»ó 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°³ÀÇ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.
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 5609422855¸¦ ´«¿©°Ü º¸±â ¹Ù¶õ´Ù. ÀÌ °ªÀº 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 |