|
お疲れさまです。
今更なんですが、英語にはまっています。
今年中に英検2級合格を目標にしています。
昨年11月に、英検3級を受験、合格しました。
今年1月に、英検準2級を受験、1次突破です。
日常では、”iknow”を利用して、英語の勉強をしています。
なんで、今頃?
と、自分でも思っています。
|
全体表示
[ リスト | 詳細 ]
|
お疲れさまです。
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)と優先順位を着けて作業しています。
おしりに火がつくのは、間近です。
|



