如何解决ZMQ 中 Req/rep 中的系统调用中断
我在计算机 (python) 上使用 zmq 与使用 zmq 的机器人 (c++) 进行通信。
大部分时间通信都有效,但在一段时间后(没有确切的时间点)被 interrupted system call
错误中断。
蟒蛇: 连接
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
错误。从我读到的内容来看,这意味着有些东西正在阻塞,但我无法弄清楚可能是什么问题。
谁能弄清楚我做错了什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。