• <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提供的函數參數/返回值封裝服務, 并將封裝結果通過網絡傳到服務器.
            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個函數, 注意其中一個有2個參數.
            然后可以用rpcgen生成一個Makefile:

            rpcgen -a -N test.x

            這會生成Makefile, 客戶端和服務端的程序, 和函數示例.
            我們手工修改一下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服務端的處理函數, 提供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了.
            生成可執行程序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 周強 閱讀(1188) 評論(0)  編輯 收藏 引用 所屬分類: linux網絡編程

            精品伊人久久久| 久久精品国产亚洲AV大全| 四虎国产精品免费久久久| 夜夜亚洲天天久久| 四虎国产精品成人免费久久| 亚洲国产成人精品女人久久久| 99久久综合国产精品免费| 久久久精品2019免费观看| 成人a毛片久久免费播放| 色综合久久夜色精品国产| 久久久久亚洲AV片无码下载蜜桃 | 97精品伊人久久久大香线蕉| 久久精品亚洲男人的天堂| 99久久夜色精品国产网站 | 好久久免费视频高清| 久久五月精品中文字幕| 青草国产精品久久久久久| 日本加勒比久久精品| 91精品国产综合久久久久久| 人人狠狠综合88综合久久| 国产美女久久精品香蕉69| 免费无码国产欧美久久18| 99久久夜色精品国产网站| 国内精品久久久久影院日本 | 人妻精品久久无码区| 欧美日韩中文字幕久久久不卡 | 久久久久国产精品人妻| 精品欧美一区二区三区久久久| 久久精品亚洲精品国产色婷| 亚洲国产成人精品无码久久久久久综合| 久久久无码人妻精品无码| 久久久久久国产精品美女| 97视频久久久| 久久99热这里只频精品6| 亚洲精品乱码久久久久久不卡| 久久久久18| 女同久久| 久久婷婷午色综合夜啪| 伊人久久亚洲综合影院| 超级碰碰碰碰97久久久久| 奇米影视7777久久精品人人爽|