1

C実行可能ファイルとPythonスクリプトの間に通信パイプを確立しようとしています。以下はPythonスクリプトですが、これに関する奇妙な点は次のとおりです。以下のようにPythonスクリプトを実行すると、C実行可能ファイルにソケット上のデータが表示されることはありません。

ただし、Readerクラスのコメントを解除すると(つまり、ソケットへの書き込みのみが有効になる)、C実行可能ファイルは常にソケット上のデータを受信します。リーダースレッドとライタースレッドが同時に実行されているときにこれが機能しない理由を誰かが説明していますか?

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

編集:

提案されているように、私は以下のようにグローバルに接続を開こうとしていますが、それは私に2つの追加の問題を与えます:

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")
4

1 に答える 1

0

1)データを送信した後、Python側で受信できるのは4バイトだけですが、データの無限のストリームを受信して​​いるようです...

送信者は送信を続け、受信したデータがそれに応答する場合、サーバーは応答を続けます。

2)このグローバルに開かれたストリームはどこで閉じることができますか?

もう必要なくなったら…停止状態などはありますか?

于 2012-11-23T11:26:33.490 に答える