• <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>
            隨筆 - 60, 文章 - 0, 評論 - 197, 引用 - 0
            數(shù)據(jù)加載中……

            Win32 RPC 編程(三)

            我們在上一節(jié)的基礎(chǔ)上,討論如何實現(xiàn)異步的 RPC 調(diào)用。前兩節(jié)演示的函數(shù)調(diào)用都是同步的,即調(diào)用函數(shù) Hello() 時,
            客戶端將阻塞住直到服務(wù)端的 Hello() 函數(shù)返回。如果服務(wù)端函數(shù)需要進行一些費時的操作,例如復(fù)雜的計算、查詢,
            客戶端只能一直阻塞在那里。這種情況下,我們可以使用異步的 RPC 提高客戶端的性能。

            異步的RPC是通過配置文件(.acf)來啟用的:
            --------------------------------------------
            Hello.acf:

            [  
                   implicit_handle(handle_t HelloWorld_Binding)  
            ]  

            interface  HelloWorld
            {
                   [async] Hello();  // 增加了 [async] 表明這是異步調(diào)用
            }

             
            原來的接口 HelloWorld 有兩個方法,Hello() 和 Shutdown(),Shutdown() 我們?nèi)匀蛔屗峭秸{(diào)用,所以在.acf文
            件中不用列出。IDL 接口文件還是可以不用修改。


            服務(wù)端的代碼 server.c 中的 Hello() 要改成下面的樣子:
            ------------------------------------------------------
            void Hello(PRPC_ASYNC_STATE rpcAsyncHandle, const unsigned char * psz)
            {
                 // 模擬一個長時間的操作
                 printf("Sleep 5 seconds...\n");
                 Sleep(5000);
             

                 printf("%s\n", psz);
                 // 表明調(diào)用已經(jīng)完成

                 RpcAsyncCompleteCall(rpcAsyncHandle, NULL);
            }

            服務(wù)端的其它代碼不用修改。
             

            客戶端client.c中的調(diào)用方式也要換:
            ---------------------------------
            int main(int argc, char * argv[])
            {
                 // 前面都相同
                 ...
               
                 // 下面是調(diào)用服務(wù)端的函數(shù)
                 RpcTryExcept
                 {

                     if ( _stricmp(argv[1], "SHUTDOWN") == 0 )
                     {
                          Shutdown();
                     }
                     else
                     {
                          // 初始化異步調(diào)用
                          RPC_ASYNC_STATE async;
                          RpcAsyncInitializeHandle( &async, sizeof(async) );
                          async.UserInfo = NULL;
                          async.NotificationType = RpcNotificationTypeNone;

                          // 本函數(shù)能立即返回
                          Hello( &async, (unsigned char*)argv[1]);

                          // 查詢調(diào)用的狀態(tài)
                          while ( RpcAsyncGetCallStatus(&async) == RPC_S_ASYNC_CALL_PENDING )
                          {
                               printf("Call Hello() pending, wait 1s...\n");
                               Sleep(1000);
                          }

                          // 通知調(diào)用已經(jīng)完成
                          RpcAsyncCompleteCall( &async, NULL );
                     }
                 }
                 RpcExcept(1)
                 {
                     printf( "RPC Exception %d\n", RpcExceptionCode() );
                 }
                 RpcEndExcept

               
                 // 后面都相同
                 ...
            }

            這樣客戶端就實現(xiàn)了異步調(diào)用!

            示例下載
             

            posted on 2008-04-29 11:22 Normandy 閱讀(2782) 評論(1)  編輯 收藏 引用 所屬分類: Networking

            評論

            # re: Win32 RPC 編程(三)  回復(fù)  更多評論   

            我最近正在Windows下開發(fā)RPC服務(wù)器與客戶端程序,現(xiàn)在只是前期熟悉試驗階段,網(wǎng)上的hello world程序已經(jīng)可以正常運行了,但是我現(xiàn)在想在服務(wù)器端返回二進制流,IDL中定義的接口如下:

            char* helloworld([in,string]const char* psz)

            在服務(wù)器端實現(xiàn)代碼如下:
            unsigned char* helloworld(const unsigned char* psz)
            {
            unsigned char* pTest = new unsigned char[4] ;
            int nTest = 100 ;
            memcpy(pTtest,&nTest,4) ;

            return pTtest ;
            }

            客戶端調(diào)用方式
            unsigned char* pTest = helloworld((unsigned char*)"Hello Server!");
            int nTest ;
            memcpy(&nTest ,pTest,4) ;

            nTest得到的很大的一個數(shù),pTest的內(nèi)容也不對,請問大家應(yīng)該怎樣定義接口文件,怎樣才能得到正確的返回值呢?謝謝了
            2013-09-04 19:43 | forest21000
            久久精品国产半推半就| 亚洲国产精品成人久久| 久久96国产精品久久久| 欧美粉嫩小泬久久久久久久 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 色综合久久综精品| 奇米影视7777久久精品人人爽| 久久综合噜噜激激的五月天 | 久久久无码精品亚洲日韩软件| 影音先锋女人AV鲁色资源网久久| 久久噜噜电影你懂的| 久久久久人妻一区精品色| 无码八A片人妻少妇久久| 久久久久亚洲AV无码专区网站 | 久久777国产线看观看精品| 欧洲人妻丰满av无码久久不卡| 欧美精品丝袜久久久中文字幕 | 久久人人爽人人爽AV片| 久久久久久久久久久久久久| 国产日韩久久免费影院| 国内精品免费久久影院| 中文精品久久久久人妻| 色狠狠久久综合网| 97精品国产91久久久久久| 欧美久久久久久午夜精品| 日韩电影久久久被窝网| 中文字幕久久波多野结衣av| 久久被窝电影亚洲爽爽爽| 久久精品国产一区二区| 精品久久久中文字幕人妻| 久久免费国产精品一区二区| 国产精品成人久久久| 99久久亚洲综合精品成人| 久久久久人妻一区二区三区| 国产精品久久久久无码av| 热99RE久久精品这里都是精品免费 | 精品综合久久久久久97超人| 久久精品中文字幕一区| 精品人妻伦一二三区久久| 久久综合九色综合欧美狠狠| www.久久精品|