• <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 周強 閱讀(1173) 評論(0)  編輯 收藏 引用 所屬分類: linux 、網絡編程

            色诱久久久久综合网ywww| av无码久久久久久不卡网站| a级毛片无码兔费真人久久| 久久国产乱子精品免费女| 香蕉久久一区二区不卡无毒影院| 久久91精品综合国产首页| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久香蕉国产线看观看乱码| 91精品国产91久久| 亚洲中文字幕无码久久综合网| 国产精品无码久久久久久| 国产综合成人久久大片91| 久久久无码精品亚洲日韩蜜臀浪潮| 久久久国产精品亚洲一区| 国产午夜福利精品久久| 一个色综合久久| 久久免费视频观看| 无码人妻精品一区二区三区久久 | 久久精品中文字幕大胸| 国产91色综合久久免费分享| 香蕉99久久国产综合精品宅男自| 久久久久久国产精品免费无码| 久久久国产精华液| 色综合久久中文色婷婷| 久久精品天天中文字幕人妻| 国产欧美久久久精品影院| 国产精品青草久久久久福利99| 久久99精品国产麻豆| 国产亚洲精品久久久久秋霞| 无码精品久久一区二区三区 | 欧美日韩精品久久久久| 国产一区二区三精品久久久无广告| 日本强好片久久久久久AAA| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久人搡人人玩人妻精品首页 | 精品一二三区久久aaa片| 精品久久久久久无码中文字幕 | 久久久久久国产精品美女| 久久久久综合国产欧美一区二区| 26uuu久久五月天| 99久久精品国产一区二区三区|