• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Just enjoy programming

            linux RPC 測試(轉載)

            轉自:
            http://www.justwinit.cn/post/3960/


            RPC是glibc提供的函數(shù)參數(shù)/返回值封裝服務, 并將封裝結果通過網絡傳到服務器.
            RPC服務端首先要啟動portmapper服務.
            測試一個簡單的RPC傳輸示例, 先定義一個模板文件test.x

            program TESTPROG{
                    version VERSION{
                            int int_echo(int)=1;
                            int get_str_len(string)=2;
                            int add ( int, int ) = 3;
                    }=1;
            }=30000;
            內含3個函數(shù), 注意其中一個有2個參數(shù).
            然后可以用rpcgen生成一個Makefile:

            rpcgen -a -N test.x

            這會生成Makefile, 客戶端和服務端的程序, 和函數(shù)示例.
            我們手工修改一下Makefile

            # This is a template Makefile generated by rpcgen
            # Parameters
            CLIENT = test_client
            SERVER = test_server
            SOURCES_CLNT.c =
            SOURCES_CLNT.h =
            SOURCES_SVC.c =
            SOURCES_SVC.h =
            SOURCES.x = test.x
            TARGETS_SVC.c = test_svc.c test_server.c test_xdr.c
            TARGETS_CLNT.c = test_clnt.c test_client.c test_xdr.c
            TARGETS = test.h test_xdr.c test_clnt.c test_svc.c
            OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
            OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
            # Compiler flags
            CFLAGS += -g -pipe
            LDLIBS += -lnsl
            RPCGENFLAGS = -N
            # Targets
            all : $(CLIENT) $(SERVER)
            $(TARGETS) : $(SOURCES.x)
                    rpcgen $(RPCGENFLAGS) $(SOURCES.x)
            $(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)
            $(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)
            $(CLIENT) : $(OBJECTS_CLNT)
                    $(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS)
            $(SERVER) : $(OBJECTS_SVC)
                    $(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)
            clean:
                     $(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)

            修改test_server.c服務端的處理函數(shù), 提供3種服務:

            /*
            * This is sample code generated by rpcgen.
            * These are only templates and you can use them
            * as a guideline for developing your own functions.
            */
            #include "test.h"
            int *
            int_echo_1_svc(int arg1,  struct svc_req *rqstp)
            {
                    static int  result;
                    //echo.
                    result=arg1;
                    printf("[RPC1] source=%d, echo=%d\n", arg1, result);
                    return &result;
            }
            int *
            get_str_len_1_svc(char *arg1,  struct svc_req *rqstp)
            {
                    static int  result;
                    //get strlen.
                    result=strlen(arg1);
                    printf("[PRC2] str=%s, len=%d\n", arg1, result);
                    return &result;
            }
            int *
            add_1_svc(int arg1, int arg2,  struct svc_req *rqstp)
            {
                    static int  result;
                    result=arg1+arg2;
                    printf("[RPC3] %d+%d=%d\n", arg1, arg2, result);
                    return &result;
            }

            客戶端test_client.c, 調用這三種服務:

            /*
            * This is sample code generated by rpcgen.
            * These are only templates and you can use them
            * as a guideline for developing your own functions.
            */
            #include "test.h"
            void
            testprog_1(char *host)
            {
                    CLIENT *clnt;
                    int  *result_1;
                    int int_echo_1_arg1=55;
                    int  *result_2;
                    char *get_str_len_1_arg1="Hello, world";
                    int  *result_3;
                    int add_1_arg1=10;
                    int add_1_arg2=20;
                    clnt = clnt_create (host, TESTPROG, VERSION, "udp");
                    if (clnt == NULL) {
                            clnt_pcreateerror (host);
                            exit (1);
                    }
                    result_1 = int_echo_1(int_echo_1_arg1, clnt);
                    if (result_1 == (int *) NULL) {
                            clnt_perror (clnt, "call failed");
                    }
                    else
                            printf("[PRC1] echo %d, source %d\n", *result_1,
                                    int_echo_1_arg1);
                    result_2 = get_str_len_1(get_str_len_1_arg1, clnt);
                    if (result_2 == (int *) NULL) {
                            clnt_perror (clnt, "call failed");
                    }
                    else
                            printf("[RPC2] return %d, should %d\n", *result_2,
                                    strlen(get_str_len_1_arg1));
                    result_3 = add_1(add_1_arg1, add_1_arg2, clnt);
                    if (result_3 == (int *) NULL) {
                            clnt_perror (clnt, "call failed");
                    }
                    else
                            printf("[PRC3] %d+%d=%d\n", add_1_arg1, add_1_arg2,
                                    *result_3);
                    clnt_destroy (clnt);
            }
            OK, 可以調用make了.
            生成可執(zhí)行程序test_server和test_client.
            我們啟動./test_server, 用rpcinfo看看:

            $rpcinfo -p 127.0.0.1
            program vers proto port
            100000 2 tcp 111 portmapper
            30000 1 udp 36307
            30000 1 tcp 34883
            Bingo! 啟動成功.

            再開個終端, 嘗試一下調用.

            ./test_client 127.0.0.1
            [PRC1] echo 55, source 55
            [RPC2] return 12, should 12
            [PRC3] 10+20=30

            正是我們期望的.

            Add By:Jackxiang
            make -f Makefile.test

            posted on 2011-08-07 16:44 周強 閱讀(1197) 評論(0)  編輯 收藏 引用 所屬分類: linux網絡編程

            亚洲国产精品狼友中文久久久 | 青青草原综合久久大伊人精品| 亚洲欧洲久久久精品| 久久男人中文字幕资源站| 欧美激情精品久久久久久| 亚洲国产精品成人久久蜜臀| 武侠古典久久婷婷狼人伊人| 久久久久亚洲AV无码专区首JN| 一本色道久久综合狠狠躁| 久久久免费精品re6| 日本免费久久久久久久网站| 久久e热在这里只有国产中文精品99| 亚洲精品无码专区久久同性男| 狠狠色丁香久久婷婷综合蜜芽五月| 久久精品国产网红主播| 久久国产热这里只有精品| 青青草原综合久久大伊人| 久久偷看各类wc女厕嘘嘘| 亚洲午夜久久影院| 国产精品99久久久精品无码| 久久99久久99小草精品免视看| 亚洲欧美日韩久久精品| 热久久国产精品| 国产精品对白刺激久久久| 久久伊人精品青青草原日本| 亚洲日本va中文字幕久久| 久久91精品综合国产首页| 国产精品久久国产精麻豆99网站| 亚洲AⅤ优女AV综合久久久| 久久美女人爽女人爽| 久久夜色精品国产噜噜噜亚洲AV| 精品99久久aaa一级毛片| 国内精品久久久久久久97牛牛| 久久久久99这里有精品10| 国产亚洲美女精品久久久| 久久国产乱子伦免费精品| 久久久亚洲AV波多野结衣| 免费无码国产欧美久久18| 亚洲欧美国产精品专区久久| 国产精品久久久久一区二区三区 | 国产精品久久久久无码av|