SEな日々

「自分の時間を大切に」 を目標に活動します。ヽ(^o^)丿

SEな日々

[ リスト | 詳細 ]

SEの日々の喜びと苦悩を紹介。
記事検索
検索

全60ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]

お疲れさまです。
 
RPCプログラムのクライアント編です。
 
 
 
■RPCクライアントサンプル
#include "rpcservice.h"   // MIDLより生成するヘッダファイル(RPC関数定義)
 
DWORD WINAPI dwRpcFileProc ( LPVOID lpv )
{
    RPC_STATUS lngStatus;
   unsigned char szProtocol[13] = "ncacn_ip_tcp"; //TCPを利用するコネクションサービス
     unsigned char szEndpoint[6] = "10200";          //ポート番号
     unsigned char *pszStringBinding = NULL;
     char *IPaddress="172.18.5.145";
   static TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1] = _T("");
     DWORD dwNameLength = sizeof(szComputerName);
 
     ::GetComputerName(szComputerName, &dwNameLength);

     //#RPC接続に必要なバインドハンドル文字列を編集する
     lngStatus = RpcStringBindingCompose (
        NULL,
        szProtocol,
        (unsigned char *)IPaddress,
         /*(unsigned char *)szComputerName,*/
        szEndpoint,
        NULL,
        &pszStringBinding );
 
     //#正常処理の場合
     if ( lngStatus == RPC_S_OK )
     {
          //#RPCサーバと接続する
          lngStatus = RpcBindingFromStringBinding (
                              pszStringBinding,
                              &hRpcService );  ☛ ACFファイルで定義したバインドハンドル
  
         //#サーバのエンドポイントを認識できない場合
          if ( lngStatus != RPC_S_OK )
          {
               //#バインドハンドル文字列を解放する
              RpcStringFree ( &pszStringBinding );
               return FALSE;
          }
     }
     else
      //#エラーが発生した場合
     {
           //#エラーメッセージを出力する
           ...省略
           return FALSE;
     }
      //dwAuthLevel = RPC_C_AUTHN_LEVEL_NONE;
      DWORD dwAuthLevel = RPC_C_AUTHN_LEVEL_CALL;
      lngStatus = ::RpcBindingSetAuthInfo (
             hRpcService,   ☛ ACFファイルで定義したバインドハンドル
             NULL,
             dwAuthLevel,
             RPC_C_AUTHN_WINNT,
             NULL,
             0 );

     RpcTryExcept
     //#RPCサービスを実行する
     {
          RpcMgmtSetComTimeout ( hRpcService, RPC_C_BINDING_DEFAULT_TIMEOUT );  
          //#RPCサービス(intRpcFileUpload関数)を実行する
          int intRes;
          WCHAR szFileName[4096];
         intRes = intRpcFileUpload ( (unsigned char*)lstRpc->rstrDraftFileName );
                               ☟
            RPC提供関数
         if ( !intRes )
         {
               //#エラーメッセージを出力する
                ....省略
              return FALSE;
         }
     }
      RpcExcept(1)
      //#RPC例外処理
     {
      //#エラーメッセージを出力する
      ....省略
     return FALSE;
    }
    RpcEndExcept
     eturn TRUE;
}
/****************************************************************************
    FUNCTION: midl_user_allocate(size_t)
    PURPOSE:  Allocate memory as needed by the RPC runtime library
    COMMENTS: The stubs or runtime libraries may need to allocate memory.
              By convention, they call a user-specified function named
              midl_user_allocate.  In this application, no memory
              management is needed, so a dummy function is provided.
****************************************************************************/
void __RPC_FAR * __RPC_API midl_user_allocate(size_t len)
{
    UNREFERENCED_PARAMETER(len);
    return(NULL);  // no memory management required
}
/****************************************************************************
    FUNCTION: midl_user_free(void *)
    PURPOSE:  Free memory as needed by the RPC runtime library
    COMMENTS: The stubs or runtime libraries may need to free memory.
              By convention, they call a user-specified function named
              midl_user_free.  In this application, no memory allocation
              is needed so a dummy function is provided.
****************************************************************************/
void __RPC_API midl_user_free(void __RPC_FAR * ptr)
{
    UNREFERENCED_PARAMETER(ptr);
    return;    // no memory management required
}
お疲れさまです。
 
今日は、プログラムのサンプルを公開したいと思います。
 
技術的には、新しくありませんが、備忘録として、残したいと思います。
 
動作確認は、WinXpSP3、VC2003です。
 
1. UUIDを取得します(uuidgen)
 
2. インターフェース定義言語ファイル(.IDL)を作成します
 
3. 属性構成ファイル(.ACF)を作成します
 
4. MIDLユーティリティコマンドで、IDLファイルとACFファイルをコンパイルします
  midl /acf ACFファイル IDLファイル
 
■UUIDを取得します。
 
コマンドラインから、
 
uuidgen -i > ".IDLファイル名”
 
を実行します。
 
■.IDLファイル
[
uuid(6fe83e00-95fd-11d4-0000e2277e4e),
version(1.0)
]
interface RpcService ②インターフェース名
{
import "RpcService.idl";
//ここに、RPCで呼び出す関数を定義します。
int intRpcFileUpload ( [in, string] unsigned char * rszFileName );
int intRpcFileDownload ( [in, string] unsigned char * rszFileName );
}
 
.■AFCファイルを作成します。
[implicit_handle(handle_t hRRpcService ①バインドハンドル
                  ────── (クライアントとサーバの接続を表す変数)
interface RpcService ②インターフェース名
            ───── (コンパイルすると、この名称で、ヘッダファイル.h、
               サーバファイル_s.c、クライアントファイル_c.cを生成します)
 
■RPCサーバサンプル
#include "rpcservice.h"   // MIDLより生成するヘッダファイル(RPC関数定義)
main(void)
{
 //RPCサーバ処理
 RPC_STATUS lngStatus;
 unsigned char szProtocol[13] = "ncacn_ip_tcp"; //TCPを利用するコネクションサービス
 unsigned char szEndpoint[6] = "10200";      //ポート番号
 
 //#通信プロトコルを宣言する(プロトコルシーケンスとエンドポイントの設定(TCP, 10200))
 lngStatus = RpcServerUseProtseqEp (
    szProtocol,
    RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
    szEndpoint,
    NULL );
 
//#エラーが発生した場合、以下の処理を行う
 if ( lngStatus )
 {
  char szComment [ 1024 ];
  //#エラー状態を編集する
  switch ( lngStatus )
  {
   case RPC_S_PROTSEQ_NOT_SUPPORTED:
      strcpy ( szComment, "\r\n指定したプロトコルシーケンスはサポートされていません。" );
      break;
   case RPC_S_INVALID_RPC_PROTSEQ:
      strcpy ( szComment, "\r\nプロトコルシーケンスが不正です。" );
      break;
   case RPC_S_INVALID_ENDPOINT_FORMAT:
      strcpy ( szComment, "\r\nエンドポイントのフォーマットが不正です。" );
      break;
   case RPC_S_OUT_OF_MEMORY:
      strcpy ( szComment, "\r\nメモリ例外が発生しました。" );
      break;
   case RPC_S_DUPLICATE_ENDPOINT:
      strcpy ( szComment, "\r\nエンドポイントが重複しています。" );
      break;
   case RPC_S_INVALID_SECURITY_DESC:
      strcpy ( szComment, "\r\nセキュリティ設定が不正です。" );
       break;
  }

  //#エラー情報を出力する
  ...省略
  return;
 }
 
 //#RPCサーバのインタフェースを登録する
 lngStatus = RpcServerRegisterIf (
    RpcService_v1_0_s_ifspec, // interface to register ☛ midlで生成したグローバル変数(サーバ用)
    NULL,      // MgrTypeUuid
    NULL );     // MgrEpv; null means use default

 lngStatus = ::RpcServerRegisterAuthInfo ( (unsigned char *)"サーバ名",
        RPC_C_AUTHN_WINNT,
        NULL,
        NULL );

 //#エラーが発生した場合、以下の処理を行う
 if ( lngStatus )
 {
  //#エラー情報を出力する
  ...省略
  return;
 }
 
//#RPCサーバのリスニングを開始する 
 unsigned int uintDontWait = TRUE;
 lngStatus = RpcServerListen (
    1,
    RPC_C_LISTEN_MAX_CALLS_DEFAULT ,
    !uintDontWait );
 
 //#エラーが発生した場合、以下の処理を行う
 if ( lngStatus )
 {
  char szComment [ 1024 ];
  //#エラー状態を編集する
  switch ( lngStatus )
  {
   case RPC_S_ALREADY_LISTENING:
      strcpy ( szComment, "\r\n既にサーバはリスニング状態です。" );
      break;
   case RPC_S_NO_PROTSEQS_REGISTERED:
      strcpy ( szComment, "\r\n登録されていないプロトコルシーケンスを設定しています。" );
      break;
   case RPC_S_MAX_CALLS_TOO_SMALL:
      strcpy ( szComment, "\r\nMaxCallsパラメータの値が小さすぎます。" );
      break;
  }
  
 //#エラー情報を出力する
  ...省略   
  return;
 }
 
if ( uintDontWait )
 {
  //RPCサーバを停止する
  lngStatus = RpcMgmtWaitServerListen();  //  wait operation
  //#エラーが発生した場合、以下の処理を行う
  if ( lngStatus )
  {
   //#エラー情報を出力する
   ...省略
   return;
  }
 }

プロトタイプ作成

お疲れさまです。
 
Win32 サービスとRPCプログラミングをしています。
 
クライアントから、RPCでサーバプログラムを呼び出して、
 
ソケット通信でファイルを転送する仕様です。
 
10年前の自作プログラムを見直して、作成しています。
 
まず、コンパイル・リンクがうまくいきません。
 
まず、英語で、Win2000以降では、動かない旨の致命的エラーがでました。
 
何度、ぐっぐっても、日本語の有益なサイトは見つからず....。
 
しかたがないので、英語サイトの調査をしました。
 
3回目のググリで、「むむ..これは!」というサイトを見つけ解決。
 
でも次は、RPCプログラムが動きません。
 
なんど、グッグても、解決策が見つかりません。
 
以前に購入したWin32ネットワークプログラミングのRPC部分を、
 
頭をかしげながら、読破?しました。
 
英語サイトのググリと書籍で、当てはまりそうな処置を、ひとつxずつ、検証です。
 
手さぐりながらも、ようやく、動きました。
 
しかし、問題は、まだまだ、多々あります...。
 
でも、プログラミングは面白いですね。
 
まだまだ、現役Cプログラマとして、やっていけそうな感じです。
お疲れさまです。
 
日々の仕事に追われています。
 
1)特命システム開発 2月本稼働(現在、サーバ構築と最終テスト中)
 
2)起案システム追加機能(早々にプロタイプ作成)
 
3)レポート作成(9月から未着手、期限は未定だが、今年度作業)
 
4)社内PC導入管理(社内PCの発注手配)
 
5)社内LAN管理作業(申請受付、セキュリティパッチ等)
 
6)社内LAN問い合わせ各種(忙しいときは、半日かかります)
 
7)社内LAN移管作業(別部署に移管が決まっています。3月まで)
 
現在は、1)、2)と優先順位を着けて作業しています。
 
おしりに火がつくのは、間近です。
 

次の仕事

 お疲れさまです。
 
特命事項作業の目処がつきました。
 
そこで、次の作業指示がありました。
 
1つ目は、形式手法についてのレポート作成です。
 
2つ目は、社内クライアントPCの発注調整です。
 
3つ目は、プログラミングなので、ちょっと楽しみです。
 
もともと、プログラミングは好きなので、3つ目に力をいれたい感じです。
 
 
クライアントから、サーバにファイルを格納するという仕様です。
 
条件としては、ファイル共有しないで(外から見えない)、
 
クライアントの文書ファイルをサーバに登録して、随時参照できるようにすると
 
いうものです。
 
サーバ側にサービスプログラムを作成して、
 
クライアントから、RPCコールで通信でファイル転送させようと検討中です。
 
C++でのプログラミングです。
 
 
1月の作業としては、ちょっとした残業になりそうですが、
 
まぁ、楽しめる作業があるので、
 
なんとか、乗り切れそうです。
 
おそらく....。

全60ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]


.
SE
SE
男性 / O型
人気度
Yahoo!ブログヘルプ - ブログ人気度について

ブログバナー

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

標準グループ

Yahoo!からのお知らせ

よしもとブログランキング

もっと見る

プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事