Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Example Code - Named Pipes (Python 2.4 + ctypes on Windows)

Reply
Thread Tools

Example Code - Named Pipes (Python 2.4 + ctypes on Windows)

 
 
Srijit Kumar Bhadra
Guest
Posts: n/a
 
      03-25-2005
Hello,
Here is an example of Multithreaded Pipe Server and Client using the
excellent ctypes library (Windows).

Reference - MSDN:
http://msdn.microsoft.com/library/de...ipe_server.asp
and
http://msdn.microsoft.com/library/de...ipe_client.asp

Best Regards,
Srijit

Named Pipe Server Source Code:

from ctypes import *

PIPE_ACCESS_DUPLEX = 0x3
PIPE_TYPE_MESSAGE = 0x4
PIPE_READMODE_MESSAGE = 0x2
PIPE_WAIT = 0
PIPE_UNLIMITED_INSTANCES = 255
BUFSIZE = 4096
NMPWAIT_USE_DEFAULT_WAIT = 0
INVALID_HANDLE_VALUE = -1
ERROR_PIPE_CONNECTED = 535

MESSAGE = "Default answer from server\0"
szPipename = "\\\\.\\pipe\\mynamedpipe"


def ReadWrite_ClientPipe_Thread(hPipe):
chBuf = create_string_buffer(BUFSIZE)
cbRead = c_ulong(0)
while 1:
fSuccess = windll.kernel32.ReadFile(hPipe, chBuf, BUFSIZE,
byref(cbRead), None)
if ((fSuccess ==1) or (cbRead.value != 0)):
print chBuf.value
cbWritten = c_ulong(0)
fSuccess = windll.kernel32.WriteFile(hPipe,
c_char_p(MESSAGE),
len(MESSAGE),
byref(cbWritten),
None
)
else:
break
if ( (not fSuccess) or (len(MESSAGE) != cbWritten.value)):
print "Could not reply to the client's request from the
pipe"
break
else:
print "Number of bytes written:", cbWritten.value

windll.kernel32.FlushFileBuffers(hPipe)
windll.kernel32.DisconnectNamedPipe(hPipe)
windll.kernel32.CloseHandle(hPipe)
return 0

def main():
THREADFUNC = CFUNCTYPE(c_int, c_int)
thread_func = THREADFUNC(ReadWrite_ClientPipe_Thread)
while 1:
hPipe = windll.kernel32.CreateNamedPipeA(szPipename,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE
|
PIPE_WAIT,

PIPE_UNLIMITED_INSTANCES,
BUFSIZE, BUFSIZE,

NMPWAIT_USE_DEFAULT_WAIT,
None
)
if (hPipe == INVALID_HANDLE_VALUE):
print "Error in creating Named Pipe"
return 0

fConnected = windll.kernel32.ConnectNamedPipe(hPipe, None)
if ((fConnected == 0) and (windll.kernel32.GetLastError() ==
ERROR_PIPE_CONNECTED)):
fConnected = 1
if (fConnected == 1):
dwThreadId = c_ulong(0)
hThread = windll.kernel32.CreateThread(None, 0,
thread_func, hPipe, 0, byref(dwThreadId))
if (hThread == -1):
print "Create Thread failed"
return 0
else:
windll.kernel32.CloseHandle(hThread)
else:
print "Could not connect to the Named Pipe"
windll.kernel32.CloseHandle(hPipe)
return 0


if __name__ == "__main__":
main()



Named Pipe Client Source Code:

from ctypes import *

GENERIC_READ = 0x80000000
GENERIC_WRITE = 0x40000000
OPEN_EXISTING = 0x3
INVALID_HANDLE_VALUE = -1
PIPE_READMODE_MESSAGE = 0x2
ERROR_PIPE_BUSY = 231
ERROR_MORE_DATA = 234
BUFSIZE = 512

MESSAGE = "Default message from client\0"
szPipename = "\\\\.\\pipe\\mynamedpipe"

def main():
while 1:
hPipe = windll.kernel32.CreateFileA(szPipename, GENERIC_READ |
GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, None)
if (hPipe != INVALID_HANDLE_VALUE):
break
else:
print "Invalid Handle Value"
if (windll.kernel32.GetLastError() != ERROR_PIPE_BUSY):
print "Could not open pipe"
return
elif ((windll.kernel32.WaitNamedPipeA(szPipename, 20000)) ==
0):
print "Could not open pipe\n"
return


dwMode = c_ulong(PIPE_READMODE_MESSAGE)
fSuccess = windll.kernel32.SetNamedPipeHandleState(hPipe,
byref(dwMode), None, None);
if (not fSuccess):
print "SetNamedPipeHandleState failed"
cbWritten = c_ulong(0)
fSuccess = windll.kernel32.WriteFile(hPipe, c_char_p(MESSAGE),
len(MESSAGE), byref(cbWritten), None)
if ((not fSuccess) or (len(MESSAGE) != cbWritten.value)):
print "Write File failed"
return
else:
print "Number of bytes written:", cbWritten.value

fSuccess = 0
chBuf = create_string_buffer(BUFSIZE)
cbRead = c_ulong(0)
while (not fSuccess): # repeat loop if ERROR_MORE_DATA
fSuccess = windll.kernel32.ReadFile(hPipe, chBuf, BUFSIZE,
byref(cbRead), None)
if (fSuccess == 1):
print "Number of bytes read:", cbRead.value
print chBuf.value
break
elif (windll.kernel32.GetLastError() != ERROR_MORE_DATA):
break

windll.kernel32.CloseHandle(hPipe)
return


if __name__ == "__main__":
main()

 
Reply With Quote
 
 
 
 
Paul L. Du Bois
Guest
Posts: n/a
 
      03-25-2005

Srijit Kumar Bhadra wrote:
> Hello,
> Here is an example of Multithreaded Pipe Server and Client using the
> excellent ctypes library (Windows).


Coincidentally, the other day I just used named pipes in for the first
time. I recommend using the excellent win32api extension; I believe it
is included by deafult in the ActiveState distro.

The API calls look fairly similar, but you pass strings instead of
c_whatever_p(), they return tuples, and they throw exceptions instead
of returning HRESULT h s.t. FAILED(h). The resulting code feels much
more Pythonic. For example, my first test looked like this:

def testread(self):
"""Read all data currently in pipe."""
while True:
try:
(nRead, nAvail, nMessage) =
win32pipe.PeekNamedPipe(self.hFile, 0)
if nAvail:
(hr, data) = win32file.ReadFile(self.hFile, nAvail)
return data
except pywintypes.error, e:
errno = e.args[0]
if errno == 109: # other end disconnected
self.disconnect()
self.connect()
else:
raise

It's kind of cool that you can directly port C code to Python, but the
end result is IMO nigh-unreadable.

p

 
Reply With Quote
 
 
 
 
Srijit Kumar Bhadra
Guest
Posts: n/a
 
      03-26-2005
Hello,
I am quite familiar with Mark Hammond's win32all. It is excellent.
However, I wish that there was more documentation of win32all beyond
existing PyWin32.chm. I am aware of "Python Programming on Win32" but I
do not have access to it at present.

Best Regards,
/Srijit

 
Reply With Quote
 
Harald Massa
Guest
Posts: n/a
 
      03-26-2005
"Srijit Kumar Bhadra" <(E-Mail Removed)> wrote in
> Here is an example of Multithreaded Pipe Server and Client using the
> excellent ctypes library (Windows).


Excellent. Maybe you would also like to post it to the

http://starship.python.net/crew/thel...i/CtypesModule

Ctypes-Wiki for easier reference?

best regards,

Harald
 
Reply With Quote
 
Thomas Heller
Guest
Posts: n/a
 
      03-26-2005
"Srijit Kumar Bhadra" <(E-Mail Removed)> writes:

> Hello,
> I am quite familiar with Mark Hammond's win32all. It is excellent.
> However, I wish that there was more documentation of win32all beyond
> existing PyWin32.chm. I am aware of "Python Programming on Win32" but I
> do not have access to it at present.


At least one chapter of PPW32 is available as sample chapter somewhere
on an OReilly site - but you should buy the book anyway imo. For the
windows api functions you should refer to Microsoft's docs at MSDN.

Thomas
 
Reply With Quote
 
Thomas Heller
Guest
Posts: n/a
 
      03-26-2005
Harald Massa <(E-Mail Removed)> writes:

> "Srijit Kumar Bhadra" <(E-Mail Removed)> wrote in
>> Here is an example of Multithreaded Pipe Server and Client using the
>> excellent ctypes library (Windows).

>
> Excellent. Maybe you would also like to post it to the
>
> http://starship.python.net/crew/thel...i/CtypesModule
>
> Ctypes-Wiki for easier reference?


Or the activestate Python cookbook.

Thonas
 
Reply With Quote
 
Paul Du Bois
Guest
Posts: n/a
 
      03-26-2005
Srijit Kumar Bhadra wrote:
> However, I wish that there was more documentation of win32all beyond
> existing PyWin32.chm.


I suspect you have already used the "more documentation" -- it's the
MSDN docs.

p

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
ASP .NET Session State : Named Pipes Provider, error: 40 J.G. ASP .Net 0 03-09-2006 08:30 PM
"Named Pipes Provider: The network path was not found" error xz ASP .Net 0 01-20-2005 05:05 AM
named pipes Andrey Romanenko Java 3 10-04-2004 08:35 AM
IPC Mechanism Named pipes or Windows messages or sthg else ? piyush ASP .Net 0 07-14-2004 02:41 PM
Using named pipes in Java maximax Java 2 02-19-2004 01:00 PM



Advertisments