クライアント/サーバ:プロセス間通信

2017-01-23 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-22)の記事「GSL Shell & Rclient 学習」の如く、
クライアント/サーバ・システムについて実例( Lua - R 間 )を学習していて、

自分でも“クライアント/サーバ・システム”もどきを作ってみたくなった。


あれこれ検索していて、
Win32 APIの名前付きパイプによるプロセス間通信・・・
 1.プロセス間通信
  複数のプロセス間でデータのやりとりをするための仕組みを
  プロセス間通信という。・・・・・
  ・・・・・
  ・・・・・
 2.Windowsの名前付きパイプによるプロセス間通信
  本ページでは、Windowsの名前付きパイプによるプロセス間通信を取り上げる。
  UNIXにも名前付きパイプがあるが、内容が異なる。
  文献[1]に分かりやすい例があるので、まず、これを実行してみよう。
  サーバー側のプログラムを下に示す。名前付きパイプを生成して、
  それに接続して、クライアントからのデータを待っている。
  クライアントからのデータを行単位で読み込んでいる。
  ・・・・・
  ・・・・・
  クライアント側のプログラムを下に示す。
  CreateFile関数により名前付きパイプに接続する。
  WriteFile関数により行単位でデータをパイプに送り込んでいる。
  全データを送り終わったら、CloseHandle関数によりパイプを閉じる。
  ・・・・・
  ・・・・・


それで、文献[1] に行ってみた。
Win32API 名前付きパイプによるプロセス間通信 CreateNamedPipe
  Win32APIで名前付きパイプを用いてプロセス間通信を行う

  使用するAPI
  ・CreateNamedPipe
  ・ConnectNamedPipe
  ・DisconnectNamedPipe

  ・・・・・
  ・・・・・

ここにある、コードを“GSL Shell”に移植?してみた。

サーバー側:
----- test_Server.gsl
charA = |s| ffi.cast( 'char*', s )
voidA = |a| ffi.cast( 'void*', a )

ffi.cdef[[
typedef unsigned int DWORD;

int CreateNamedPipeA(
char* lpName, // パイプ名
DWORD dwOpenMode, // パイプを開くモード
DWORD dwPipeMode, // パイプ固有のモード
DWORD nMaxInstances, // インスタンスの最大数
DWORD nOutBufferSize, // 出力バッファのサイズ
DWORD nInBufferSize, // 入力バッファのサイズ
DWORD nDefaultTimeOut, // タイムアウトの間隔
int lpSecurityAttributes // セキュリティ記述子
);

int ConnectNamedPipe(
int hNamedPipe,
int lpOverlapped
);

int ReadFile(
int hFile,
char* lpBuffer,
DWORD nNumberOfBytesToRead,
void* lpNumberOfBytesRead,
int lpOverlapped
);

int FlushFileBuffers( int hFile );
int DisconnectNamedPipe( int hNamedPipe );
int CloseHandle( int hObject );
]]

hPipe = ffi.C.CreateNamedPipeA( charA("\\\\.\\pipe\\mypipe"),
0x00000003, 0x00000000,
3, 0, 0, 100, 0 )
print( hPipe ) --------- デバッグ用

rcd = ffi.C.ConnectNamedPipe( hPipe, 0 )
print( rcd ) --------- デバッグ用

szBuff=ffi.new('char[256]')
B_read=ffi.new('uint32_t[1]')
while true do
rcd=ffi.C.ReadFile( hPipe, szBuff, 256, voidA(B_read), 0)
if rcd==0 then break end
str=ffi.string(szBuff,B_read[0])
print( str )
end

ffi.C.FlushFileBuffers( hPipe )
ffi.C.DisconnectNamedPipe( hPipe )
ffi.C.CloseHandle( hPipe )
こうでしょうか?
CreateNamedPipe は、CreateNamedPipeA だった。

クライアント側:
----- test_Client.gsl
charA = |s| ffi.cast( 'char*', s )
voidA = |a| ffi.cast( 'void*', a )

ffi.cdef[[
typedef unsigned int DWORD;

int CreateFileA(
char* pszFileName, // ファイル名
DWORD dwAccess, // アクセス指定
DWORD dwShare, // 共有方法
int psa, // セキュリティ属性
DWORD dwCreatDisposition, // 動作指定
DWORD dwFlagsAndAttributes, // フラグと属性
int hTemplate // テンプレートファイル
);

int WriteFile(
int hFile,
void* lpBuffer,
DWORD nNumberOfBytesToWrite,
void* lpNumberOfBytesWritten,
int lpOverlapped
);

int CloseHandle( int hObject );
]]

hPipe = ffi.C.CreateFileA(charA('\\\\.\\pipe\\mypipe'),
0x00000003, 0, 0, 3, 0x80, 0 )
print( hPipe ) --------- デバッグ用

bbb='hogehoge'
B_Wt=ffi.new('uint32_t[1]')

rcd=ffi.C.WriteFile( hPipe, voidA(bbb), 8, voidA(B_Wt), 0 )
print( rcd, B_Wt[0] ) --------- デバッグ用

rcd=ffi.C.WriteFile( hPipe, voidA('kamihoge'), 8, voidA(B_Wt), 0 )
print( rcd, B_Wt[0] ) --------- デバッグ用

ffi.C.CloseHandle( hPipe ) )
こうですね。
ここでも、
CreateFile は、CreateFileA だった。

それで、
サーバー側(test_Server.gsl)を先に立ち上げておいて、
次に、
クライアント側(test_Client.gsl)を立ち上げると、・・・

一方向の送受信が出来た。


ここで参照(学習)したサイトは、
PInvoke.net
Win32 API でのファイルアクセス
CreateNamedPipe function - MSDN


ところで、
せっかくパイプを“双方向モード”で作っているのだし、
ファイルも“READ or WRITE”モードでオープンしている。
それならば、双方向の通信もしたいが、・・・・・

こんなページを見つけた:
第248章 双方向から読み書きできる名前付パイプ
  今回は、
  サーバー・クライアントの双方向から書き込みのできる名前付きパイプを作ります。
  名前付きパイプはWin95/98では使えないので注意してください。

  使い方は、・・・・・
  ・・・・・
  ・・・・・

  クライアント側からの書き込みで、サーバー側がこれを読みとるのは
  前章のプログラムと同じ仕組みです。
  サーバー側からの書き込みに対してクライアント側で読みとる場合も
  ほぼ同様の仕組みでよいのですが いくつか 注意点があります。
  その一つはイベントオブジェクトを2つ用意しておかないと
  どちらの書き込みか判断が付かず、一方のスレッドが不用意に終了してしまう、
  という点です。
  ・・・・・
  ・・・・・

ン?
  イベントオブジェクトを2つ用意
だって。

それには、
イベントオブジェクト の学習が必要ですね。


本日はここまで。


“クライアント/サーバ”学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170107
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
09 | 2017/10 | 11
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 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク