GSL Shell と Lua で、プロセス間通信

2017-04-10 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
これまでで、“Lua PIPE”の如く、
数件記事にしている。

今回、
GSL Shell(LuaJIT) と、基本Luaとの間で通信出来るか?
について学習した。

基本的には、
1月(2017-01-25)の記事「クライアント/サーバ:プロセス間通信・改
にある:
  ・・・・・
  ・・・・・
  サーバー側 は前回の“test_Server.gsl”

  クライアント側 は今回の“test_Client_lua.gsl”
  ・・・・・
  ・・・・・

の様なもの。

但し、
一方向での送受信では無く、お互いが送受信するもの。


いろいろ試してみたが、・・・・・


結論としては、

PIPE 1本での双方向はムリ。
なので、
PIPE 2本を使って、それぞれ一方向とした。
これで、
EVENT はイラナイ?


GSL Shell 側で2本の PIPE を“CreateNamedPipeA”しておく。

Lua 側は、2本とも、単なるファイルと思って処理する。
但し、読み込みは“バイト数指定”方式のみ可。


それで、先に起動するもの ( GSL Shell で起動 )
----- test_Server_2Ps.gsl -----
charA = |s| ffi.cast( 'char*', s )
ffi.cdef[[ typedef unsigned int DWORD;
int CreateNamedPipeA( char*, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, int );
int ConnectNamedPipe( int, int );

int ReadFile( int, char*, DWORD, void*, int );
int WriteFile( int, char*, DWORD, void*, int );

int FlushFileBuffers( int hFile );
int DisconnectNamedPipe( int hNamedPipe );
int CloseHandle( int hObject );
]]
----- パイプを作成
P2 = ffi.C.CreateNamedPipeA( charA("\\\\.\\pipe\\pipe2"), 3, 0, 1, 0, 0, 100, 0 )
P1 = ffi.C.CreateNamedPipeA( charA("\\\\.\\pipe\\pipe1"), 3, 0, 1, 0, 0, 100, 0 )
----- Client オープン待ち
rcd = ffi.C.ConnectNamedPipe( P1, 0 )

Buf=ffi.new('char[256]')
nRd=ffi.new('uint32_t[1]'); nWt=ffi.new('uint32_t[1]')

while true do
rcd=ffi.C.ReadFile( P1, Buf, 256, nRd, 0)
str = ffi.string(Buf,nRd[0])
print( str )
sss = string.format('%4d%sHOGE', nRd[0]+4, str )
rcd=ffi.C.WriteFile( P2, charA(sss), nRd[0]+8, nWt, 0 )
if( str == '_e' ) then break end
end
----- 後処理
ffi.C.FlushFileBuffers( P1 ); ffi.C.DisconnectNamedPipe( P1 ); ffi.C.CloseHandle( P1 )
ffi.C.FlushFileBuffers( P2 ); ffi.C.DisconnectNamedPipe( P2 ); ffi.C.CloseHandle( P2 )
の様なもの。
そして、後から起動するもの( 基本 Lua で起動 )
----- test_Client_2Ps.lua

P2 = io.open( '\\\\.\\pipe\\pipe2', 'w+' )
print( P2 ) --------- デバッグ用
P1 = io.open( '\\\\.\\pipe\\pipe1', 'w+' )
print( P1 ) --------- デバッグ用
-------------------------
Buf='hogehoge'
P1:write( Buf ); P1:flush()

n = P2:read( 4 ) + 0
s = P2:read( n )
print( s )
-------------------------
P1:write( 'kamizzz' ); P1:flush()

n = P2:read( 4 ) + 0
s = P2:read( n )
print( s )
-------------------------
P1:write( '_e' ); P1:flush()

P1:close(); P2:close()
となった。

ここで、
Lua 側は、読み込みバイト数を指定しての read で無いとダメ。
なので、
書き出す GSL Shell 側では、先頭4バイトでデータ長を指定している。

また、
Lua 側での書き込み後は、flush が無いとダメ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170309,10
関連記事
スポンサーサイト

コメントの投稿

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

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



おきてがみ

最新記事
カレンダー
08 | 2017/09 | 10
- - - - - 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
ブックマーク