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")
し、パイプが壊れていることに気付くと思います。これは正しいです?