Bidirectional communication over unix socket (named pipe)

J Rice rice.jeffrey at gmail.com
Wed Mar 8 11:48:24 EST 2006


Hi, I feel like I should apologize in advance because I must be missing
something fairly basic and fundamental here.  I don't have a book on
Python network programming (yet) and I haven't been able to find an
answer on the net so far.

I am trying to create a pair of programs, one (the client) will be
short-lived (fairly) and the second (server) will act as a cache for
the client. Both will run on the same machine, so I think a simple file
socket is the easiest and most reliable method.

The problem I have is that the client can send to the server, but the
server can't send back to the client because it gets this error:

socket.error: (107, 'Transport endpoint is not connected')

This is despite the client waiting on a socket.recv() statement.  Is
the client really not connected, or is the server unaware of the
connection?  And how do I fix this?

I was able to get this working by switching to AF_INET, but that is not
what I want.

Unix sockets are bidirectional, correct?  I have never programmed one,
but I know that programs like clamav use a socket to receive an email
to scan and return the result.

Any help would be greatly appreciated!

Jeff

*** server.py ***
#!/usr/bin/python
import socket
import os, os.path
import time

if os.path.exists("/tmp/mysock"): os.remove("/tmp/mysock")

server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
server.bind("/tmp/mysock")

while True:
    datagram = server.recv(1024)
    if not datagram:
        break
    print datagram
    # the preceeding works, and I see the TEST TEST TEST statement the
client sent

    time.sleep(2)
    # it dies on the next statement.
    server.send("Thank you\n")


server.close()
if os.path.exists("/tmp/mysock"): os.remove("/tmp/mysock")


 *** client.py: ***
#!/usr/bin/python

import socket

client = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
client.connect("/tmp/mysock")


TX = "TEST TEST TEST"
TX_sent = client.send(TX)

if TX_sent <> len(TX):  print "TX incomplete"

while True:
        print "Waiting..."
        datagram = client.recv(1024)
        # the client sits here forever, I see the "waiting appear" but
it doesn't advance beyond
        #   the recv statement.
        if not datagram:
                break
        print "Received: ",datagram

client.close()




More information about the Python-list mailing list