FC2ブログ

PyWin32/win32file から Win32 API に変更

2019-06-05 :  PCクリニック
前(2019-05-29)の記事:
Python to Lua:PIPE 1本のみでバイナリ・データ通信」では、
バイナリ・データの送信だったが、
処理方式としては、その前のwin32fileをそのまま使った。

その為、
どうも気になる点があり、

  ・・・・・
  ・・・・・
  やはり、
  精神衛生上

  np.ndarray.tobytes(x)

  が気になる!!!
  ・・・・・
  ・・・・・
と書いた。


その後、
PyWin32
を使うのでは無くて、
よりC言語直に近い、
Win32 API関数
を使う方が、<紙>としては精神的に落ち着ける。

つまり、
import  win32file

P1 = win32file.CreateFile( ・・・ )

win32file.WriteFile( ・・・ )

_, dataB = win32file.ReadFile( ・・・ )

win32file.CloseHandle( P1 )
に対して、
import ctypes as ct
KER = ct.windll.KERNEL32

P1 = KER.CreateFileA( ・・・ )

_ = KER.WriteFile( ・・・ )

_ = KER.ReadFile( ・・・ )

ct.windll.KERNEL32.CloseHandle( P1 )
に変更する。


序でに、バイナリ・データについては、
前回は、numpyarrayとしてみたが、
今回は、ctypes配列とした。


結果、
全体コードは:
# coding: utf-8
# ------------------- NonE_Main_Client_Bx.py
import subprocess, time
import ctypes as ct
KER = ct.windll.KERNEL32

# ----- サーバー立ち上げ
subprocess.Popen( 'cluajit NonE_Sub_Server_Bx.lua', shell=True,
stdin=None, stdout=None, stderr=None, close_fds=True )

time.sleep( 1 ) # 立ち上げ完了待ち

#-- PIPE オープン
P1 = KER.CreateFileA( "\\\\.\\pipe\\PIPE1",
0x80000000 | 0x40000000, 0, None, 3, 0, None );
#--- GENERIC_READ | GENERIC_WRITE, OPEN_EXISTING

# ---------------------- 処理:
nIO = ( ct.c_int * 1 )()
x = ( ct.c_int * 1 )()

cnt=10000

x[0]=cnt
_ = KER.WriteFile( P1, x, 4, nIO, None ) # リクエスト送信

for i in range(cnt):
x[0]=i
_ = KER.WriteFile( P1, x, 4, nIO, None ) # リクエスト送信

# ----- 結果受信
y = ( ct.c_int * 1 )()
_ = KER.ReadFile( P1, y, 4, nIO, None ) # バイナリデータ

print( y[0] ) ### x[0] + 100

ct.windll.KERNEL32.CloseHandle( P1 )
でしょうか。
一方のサーバ側は、基本的には変わらない。
が、
メイン処理部分に繰り返し処理を追加してみた:
--------------- NonE_Sub_Server_Bx.lua
require'cdef_PIPE_Event_SUBx'

-- パイプを作成
P1=C.CreateNamedPipeA(charA("\\\\.\\pipe\\PIPE1"),3,0,1,0,0,100,0)

-- Client オープン待ち
rtn=C.ConnectNamedPipe( P1, 0 )

------------------------ 処理:
Buf = ffi.new('int32_t[4097]')

-- リクエスト受信:ループ回数
rtn=C.ReadFile( P1, charA(Buf), 4097, nIO, 0 )
cnt=Buf[0]

for i=1,cnt do
-- リクエスト受信
rtn=C.ReadFile( P1, charA(Buf), 4097, nIO, 0 )

Buf[0]=Buf[0]+100 -- サーバ側の処理本体!

-- 結果送信
rtn=C.WriteFile( P1, charA(Buf), 4, nIO, 0 )
end

C.FlushFileBuffers( P1 )
C.DisconnectNamedPipe( P1 )
C.CloseHandle( P1 )
これで、枕を高くして寝る?ことが出来る?



本日はここまで。


LuaJIT / Anaconda ( Python ) 学習は続く。


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

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



コメントの投稿

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

人気blog Ranking



最新記事
カレンダー
07 | 2021/08 | 09
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




Google Analytics
ブックマーク