Python和奇怪的套接字行为

时间:2012-11-23 10:38:40

标签: python c sockets networking pipe

我正在尝试在C可执行文件和python脚本之间建立通信管道。 下面是Python脚本,关于这一点的奇怪之处如下。如果我跑 如下所示的python脚本,然后C可执行文件永远不会看到套接字上的任何数据。

但是,如果我取消注释Reader类(即,只启用了写入套接字) 那么C可执行的ALWAYS接收套接字上的数据。有没有人解释为什么当Reader和Writer线程同时运行时这不起作用?

class Reader(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
    def run(self):
        while True:
            s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
            s.connect("/tmp/demo_socket")               
            nonce = s.recv(4)
            s.close

            if len(nonce) == 4:
                print("Result received \n")

class Writer(Thread):
    def __init__(self):
        Thread.__init__(self)
    def run(self):
        while True:
            payload = "Hello World"
            s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
            s.connect("/tmp/demo_socket")           
            s.send(payload)
            s.close()

reader = Reader()
writer = Writer()

reader.start()
writer.start()


try:
    while True:
        sleep(10000)
except KeyboardInterrupt:
    print("Terminated")

编辑:

正如我所建议的那样,我试图在全局范围内打开连接,但这给了我另外两个问题:

1)发送数据后,在Python端只接收4个字节,但似乎我收到了无穷无尽的数据流......

2)我可以在哪里关闭这个全局开放的流?

s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")  

class Reader(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.daemon = True
    def run(self):
        while True:        
            nonce = s.recv(4)

            if len(nonce) == 4:
                print("Result received \n")

class Writer(Thread):
    def __init__(self):
        Thread.__init__(self)
    def run(self):
        while True:
            payload = "Hello World"         
            s.send(payload)

reader = Reader()
writer = Writer()

reader.start()
writer.start()


try:
    while True:
        sleep(10000)
except KeyboardInterrupt:
    print("Terminated")

1 个答案:

答案 0 :(得分:0)

  

1)发送数据后,在Python端只接收4个字节,但似乎我收到了无穷无尽的数据流......

您的发件人继续发送,如果您收到的数据是对此的回复,则服务器会继续回复。

  

2)我可以在哪里关闭这个全局开放的流?

在您不再需要它之后......您是否有停止状态或类似情况?