我在计算机(python)上使用zmq与使用zmq的机器人(c++)通信。
通信大部分时间都在工作,但在一段时间后(没有确切的时间点)会被interrupted system call
错误中断
Python: 连接
self.context = zmq.Context()
self.stateSocket = self.context.socket(zmq.REQ)
self.failCounter = 0
self.poll = zmq.Poller()
try:
self.stateSocket = self.context.socket(zmq.REQ)
self.stateSocket.connect(self.connectString)
self.poll.register(self.stateSocket, zmq.POLLIN)
self.timer.start()
except zmq.ZMQError as e:
print("Connection to socket not possible: ", e)
要在QTTimer中通信循环,请执行以下操作:
retries_left = 2
while retries_left:
request = #data here
self.stateSocket.send_string(request, zmq.NOBLOCK)
expect_reply = True
while expect_reply:
socks = dict(self.poll.poll(400))
if socks.get(self.stateSocket) == zmq.POLLIN:
message = self.stateSocket.recv()
if not message:
break
expect_reply = False
retries_left = 0
self.receivedValues = [float(i) for i in message.decode("UTF-8").split(',')]
self.dataAnalysis() #do stuff with received values
else:
print("W: No response from server, retrying ...")
# Socket is confused. Close and remove it.
self.stateSocket.setsockopt(zmq.LINGER, 0)
self.stateSocket.close()
self.poll.unregister(self.stateSocket)
retries_left -= 1
if retries_left == 0:
print("E: Server seems to be offline, abandoning")
break
else:
print("I: Reconnecting and resending ")
# Create new connection
self.stateSocket = self.context.socket(zmq.REQ)
self.stateSocket.connect(self.connectString)
self.poll.register(self.stateSocket, zmq.POLLIN)
self.stateSocket.send_string(request)
和cpp部分:
//setup
zmq::context_t context{ 1 };
zmq::socket_t socket{ context, ZMQ_REP };
const std::chrono::milliseconds timeout{ 400 };
zmq::pollitem_t pollItem[1];
zmq::message_t receivedData;
try
{
int rc = zmq::poll(pollItem, 1, 400);
if (rc < 0)
{
std::cout << "No data available" << std::endl;
}
else
{
socket.recv(receivedData, zmq::recv_flags::dontwait);
}
zmq::message_t reply{ replyString.cbegin(), replyString.cend() };
socket.send(reply, zmq::send_flags::dontwait);
}
catch (zmq::error_t& e)
{
std::cout << "Sending Error: " << e.what() << std::endl;
}
这将运行30秒以上,然后cpp部件抛出一个Interrupted system call
错误。从我所读到的内容来看,这意味着有东西阻塞了,但我不知道可能是什么问题。
有人知道我做错了什么吗
目前没有回答
相关问题 更多 >
编程相关推荐