2012-11-23 52 views
1

我想在C可执行文件和python脚本之间建立一个通信管道。 下面是Python脚本,关于它的奇怪之处在于以下内容。如果我运行 下面的python脚本,那么C可执行文件从不会看到套接字上的任何数据。但是,如果我取消对Reader类的注释(即仅启用对套接字的写入) ,则C可执行的总是在套接字上接收数据。有没有人解释为什么当Reader和Writer线程同时运行时这不起作用?Python和奇怪的套接字行为

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)发送数据后,只有4个字节应收到Python的结束,但似乎我收到了层出不穷的数据...

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") 
+0

C程序可以处理多个连接吗?这导致了问题,为什么打开两个不同的连接?为什么在一个循环中一次又一次地重复连接,而不是在循环之外打开一次连接,或者为两个线程使用一个全局连接? –

+0

不需要多重连接,python脚本读取数据,通过套接字将它发送到C exe,这会做一些工作,然后将结果发送回Python脚本。也许我不应该在每个线程中打开和关闭套接字?我可以一次性“全局”打开此套接字吗? – Patrick

+0

是的,你在两个线程中连接,每个线程创建一个单独的连接,所以“服务器”需要能够处理多个连接。是的,在全球范围内开放一次是我的建议(以及我第一次评论中的问题)。 –

回答

0

1)发送数据后,只有4个字节应在Python的后期收取,但似乎我收到的数据层出不穷......

你的发件人不断发送,并且如果您收到的数据是对此的答复,服务器将继续应答。

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

当你不再需要它了......你有停止条件或类似的东西吗?