js-ctypes 学習:プロセス間通信の例

2017-03-15 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-03-13)の記事「js-ctypes 学習:LuaPy 使用」に続いて、
SpiderMonkey /js-ctypes の学習継続。

今回は、
1月(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」で書いた如く、
“GSL Shell”で作った“test_Server.gsl”“test_Client.gsl”を、
“SpiderMonkey”に移植してみた。

今回も、「Win32 API でのファイルアクセス」ページ等を参考にさせて頂いた。


初めに、“test_Client.gsl”を移植して“Client.js”を作った:
// ------------------ Client.js
var libK = ctypes.open( 'kernel32' );
// ---------- 宣言して
var CreateFile = libK.declare( 'CreateFileA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
// ---------- 実行
var fname = '\\\\.\\pipe\\mypipe';
var hPipe = CreateFile( fname, 0xC0000000, 0, 0, 3, 0x80, 0 );
// 0xC~ : READ/WRITE、 0x80 : 通常はこれで
print( hPipe ); // 確認の為

var str = 'hogehoge';
var SZ = ctypes.int32_t(1);
var fwrite = libK.declare( 'WriteFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret = fwrite( hPipe, str, str.length, SZ.address(), 0 );
print( ret, SZ.value );

var str = readline(); // 手動での動作確認の為

var fwrite = libK.declare( 'WriteFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t,
ctypes.int32_t.ptr, ctypes.int32_t );
var ret =fwrite( hPipe, 'kamikamizzz', 11, SZ.address(), 0 );
print( ret, SZ.value );

var str = readline(); // 手動での動作確認の為


var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( hPipe );
print( ret ); // 確認の為
これで、イイかな?

既存の“test_Server.gsl”を立ち上げた後、
“Client.js”を立ち上げて受信結果を確認。

OKだ。


次に、“test_Server.gsl”を移植して“Server.js”を作った:
// ------------------- Server.js
var libK = ctypes.open( 'kernel32' );

var CreatePIPE = libK.declare( 'CreateNamedPipeA', ctypes.winapi_abi, ctypes.int32_t,
ctypes.char.ptr, ctypes.uint32_t, ctypes.int32_t, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t, ctypes.int32_t, ctypes.int32_t );
var fname = '\\\\.\\pipe\\mypipe';
var hPipe = CreatePIPE( fname, 3, 0, 3, 0, 0, 100, 0 );
print( hPipe ); // 確認の為

var ConnectPIPE = libK.declare( 'ConnectNamedPipe', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.int32_t );
var rcd = ConnectPIPE( hPipe, 0 );
print( rcd ); // 確認の為

var Buf = ctypes.char.array(257)();
var SZ = ctypes.int32_t(1);
var fread = libK.declare( 'ReadFile', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t, ctypes.char.ptr, ctypes.int32_t, // この char は上記対応!
ctypes.int32_t.ptr, ctypes.int32_t );

while ( true ){
var rcd =fread( hPipe, Buf, 256, SZ.address(), 0 );
if( rcd==0 ){ break; }
print( rcd ); // 確認の為
print( SZ.value ); // 確認の為
str = Buf.readString();
print( str ); // 目的の動作確認
}

var FlushFileBuffers = libK.declare( 'FlushFileBuffers', ctypes.winapi_abi,
ctypes.int32_t, ctypes.int32_t );
var rcd = FlushFileBuffers( hPipe );
print( rcd ); // 確認の為

var DisconnectNamedPipe = libK.declare( 'DisconnectNamedPipe', ctypes.winapi_abi,
ctypes.int32_t, ctypes.int32_t );
var rcd = DisconnectNamedPipe( hPipe );
print( rcd ); // 確認の為

var fclose = libK.declare( 'CloseHandle', ctypes.winapi_abi, ctypes.int32_t,
ctypes.int32_t );
var ret =fclose( hPipe );
print( ret );
で良さそう。

この“Server.js”を立ち上げておいて、
“test_Client.gsl”を立ち上げての動作確認。

OK。


駄目押しで、
“Server.js”と“Client.js”での通信。

完了。


本日はここまで。


SpiderMonkey ( JavaScript/js-ctypes ) 学習は続く。


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


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

コメントの投稿

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

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



おきてがみ

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

<紙>

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

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


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

Google Analytics
ブックマーク