我想通过 TCP 连接两个程序。我的主程序是用 Qt 编写的,需要与另一个用 Python 编写的程序通信。我考虑使用 TCP 套接字和 Google 的 protobuf 来交换消息。在 Qt 中,我使用一个 QTcpSocket 来接受连接并从流中读取,只要它的 readyRead-Signal 被触发。在 python 中,我还使用 tcp-socket 并发送消息。
这很有效,只要没有一方被杀。目前,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")
但调用无济于事)。
最后,我的问题是:这是检查我的消息是否收到的可靠方法吗?我不想切换到 UDP,因为我不想为每条消息实现自己的 ACK 消息。
这是我第一次在 python 和 C++ 中使用套接字,并且无法真正解释为什么我的方法有效,所以我使用它有点不舒服。
有人可以告诉我更多吗?send(int(id)+"\n")
我猜python套接字在发送后首先需要一个ACK,send("\n")
然后意识到管道已损坏。这个对吗?