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

Discussion in 'Python' started by Srijit Kumar Bhadra, Mar 25, 2005.

  1. Hello,
    Here is an example of Multithreaded Pipe Server and Client using the
    excellent ctypes library (Windows).

    Reference - MSDN:
    http://msdn.microsoft.com/library/d.../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()
    Srijit Kumar Bhadra, Mar 25, 2005
    #1
    1. Advertising

  2. 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
    Paul L. Du Bois, Mar 25, 2005
    #2
    1. Advertising

  3. 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
    Srijit Kumar Bhadra, Mar 26, 2005
    #3
  4. Srijit Kumar Bhadra

    Harald Massa Guest

    "Srijit Kumar Bhadra" <> 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/theller/moin.cgi/CtypesModule

    Ctypes-Wiki for easier reference?

    best regards,

    Harald
    Harald Massa, Mar 26, 2005
    #4
  5. "Srijit Kumar Bhadra" <> 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
    Thomas Heller, Mar 26, 2005
    #5
  6. Harald Massa <> writes:

    > "Srijit Kumar Bhadra" <> 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/theller/moin.cgi/CtypesModule
    >
    > Ctypes-Wiki for easier reference?


    Or the activestate Python cookbook.

    Thonas
    Thomas Heller, Mar 26, 2005
    #6
  7. Srijit Kumar Bhadra

    Paul Du Bois Guest

    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
    Paul Du Bois, Mar 26, 2005
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. piyush
    Replies:
    0
    Views:
    1,844
    piyush
    Jul 14, 2004
  2. piyush
    Replies:
    1
    Views:
    3,158
    John Harrison
    Jul 14, 2004
  3. piyush
    Replies:
    0
    Views:
    455
    piyush
    Jul 14, 2004
  4. Tomek

    Python and named pipes problem

    Tomek, Feb 26, 2008, in forum: Python
    Replies:
    0
    Views:
    486
    Tomek
    Feb 26, 2008
  5. Luca Cerone
    Replies:
    15
    Views:
    182
    Gregory Ewing
    Aug 10, 2013
Loading...

Share This Page