Hello, Here is an example of Multithreaded Pipe Server and Client using the excellent ctypes library (Windows).
Reference - MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/multithreaded_pipe_server.asp and http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ipc/base/named_pipe_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() -- http://mail.python.org/mailman/listinfo/python-list