![](/img/trans.png)
[英]ZeroMQ socket Recv() throws 'Context was terminated' exception - why and how to recover?
[英]ZeroMq recv not blocking
盡管我的背景是C#,但我仍在嘗試為工作中的項目學習ZeroMq,在最簡單的測試中,我似乎遇到了一個問題,其中socket.recv(...)
調用將阻止收到的第一條消息,但此后引發異常,因為接收到的數據量為-1。
目前,我的“服務器”是:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://127.0.0.1:5555");
while (true)
{
zmq::message_t message;
if (socket.recv(&message))
{
auto str = std::string(static_cast<char*>(message.data()), message.size());
printf("Receieved: %s\n", str.c_str());
}
}
這基本上是從ZeroMq文檔中的第一個示例服務器開始的。
我使用以下代碼從C#“客戶端”推送1位數據:
using (var context = new ZContext())
using (var requester = new ZSocket(context, ZSocketType.REQ))
{
requester.Connect(@"tcp://127.0.0.1:5555");
requester.Send(new ZFrame(@"hello"));
requester.Disconnect(@"tcp://127.0.0.1:5555");
}
現在,我啟動服務器,然后啟動客戶端。 我已正確收到第一條消息,並且能夠正確打印此消息。 但是現在當我再次點擊socket.recv(&message)
時,該代碼將不會阻塞,而是將引發異常,因為基礎zmq_msg_recv(...)
返回值-1。
我不確定為什么會這樣,因為我知道此端口上沒有別的東西,所以我看不到為什么期待其他消息。 我遇到的唯一一件事是調用zmq_msg_close(...)
但這應該作為message_t
析構函數的一部分來調用,這一點我已經確認。
就套接字設置而言,我有做錯什么嗎?如何將它用於recv(...)
調用以停止阻塞?
您的問題是,您不能連續使用REQ-REP模式接收2個請求。
在請求-答復模式中,每個請求都要求答復。 您的客戶需要屏蔽,直到收到對第一個請求的答復。 另外,您的服務器需要在服務新請求之前回復請求。
這是引用該指南中確切問題的報價。
REQ-REP套接字對處於同步狀態。 客戶端循環發出zmq_send(),然后發出zmq_recv()(如果只需要一次,則發出一次)。 進行任何其他順序(例如,連續發送兩個消息)將導致send或recv調用的返回碼為-1。 同樣,該服務按需要的順序依次發出zmq_recv()和zmq_send()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.