0

TCP 経由で 2 つのプログラムを接続したい。私のメイン プログラムは Qt で書かれており、Python で書かれた別のプログラムと対話する必要があります。TCP ソケットと Google の protobuf を使用してメッセージを交換することを考えています。Qt では、readyRead-Signal がトリガーされるとすぐに、接続を受け入れてストリームから読み取る QTcpSocket を使用します。Python では、tcp ソケットも使用してメッセージを送信します。

これは、どちらの側も殺されない限り、非常にうまく機能します。現在、python 側は C++ 側にメッセージを送信しています。( socket.send(str(id)+"\ņ")) 送信するたびに、例外 (ピアによる接続のリセット、パイプの破損など) をチェックして、メッセージが受信されたかどうかを確認します。C++ プログラムを強制終了すると、Python クライアントから送信される次のメッセージは例外をトリガーしませんが、明らかに受信されません。次のメッセージで例外がトリガーされますが、最後のメッセージは失われます。

socket.send("\n")少し実験した後、各メッセージの後に空のメッセージ ( ) を送信すると問題が解決することがわかりました。今やる

try:
  s.send(str(id)+"\n");
  s.send("\n")
  sleep(0.5)
except socket.error,v: 
   print "FAILed to send",id,v[0],v[1]

C++-Peer が強制終了されるとすぐに例外を受け取ります (呼び出しs.send(str(id)+"\n\n")は役に立ちません)。

最後に、私の質問は次のとおりです。これは、メッセージが受信されたかどうかを確認する信頼できる方法ですか? メッセージごとに独自のACKメッセージを実装したくないので、UDPに切り替えたくありません。

Python と C++ でソケットを使用するのはこれが初めてであり、なぜ私のアプローチが機能するのかを実際に説明できないため、使用するのが少し不快です。

誰かが私にもう少し教えてもらえますか?send(int(id)+"\n")Python ソケットは、送信後に最初に ACK を期待send("\n")し、パイプが壊れていることに気付くと思います。これは正しいです?

4

1 に答える 1