簡體   English   中英

ZeroMq接收未阻止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM