2016-08-21 110 views
2

在C++中,我使用ZeroMQ構建一個簡單的客戶端 - 服務器聊天應用程序。一旦在main中初始化上下文,我想將它傳遞給一個線程,並在那裏聲明用於輸出用戶消息的套接字(即執行send)。這是我當前的代碼(客戶端/用戶端):將ZMQ上下文傳遞給線程

void Send(zmq::context_t& c) // To get messages from user and send them to the server 
{ 
    zmq::socket_t socket(c, ZMQ_REQ); 
    socket.connect ("tcp://192.168.1.84:5555"); 

    std::string mssg; 

    while (true) { 

     std::getline(std::cin, mssg); 

     if(mssg == "#exit") 
     { 
      killApp = true; // an atomic<bool> used to terminate all threads 
      break; 
     } 
     zmq::message_t mssg_(mssg.length()); 
     std::memcpy(mssg_.data(), mssg.data(), mssg.length()); 

     socket.send(mssg_); 

    } 

} 

int main() 
{ 
    // Initialising the context 
    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1); 
    std::thread t_send(Send, *context.get()); // THIS DOESN'T WORK 

    { 
     // do some stuff in the main thread (e.g. display the messages) 
    } 

    t_send.join(); 
    return 0; 
} 

我試圖通過參考線來傳遞上下文,所以我可以創建一個套接字和執行操作的其餘部分。但我不知道如何正確地做到這一點。 (或者,傳遞一個zmq :: socket_t也很好,但我面臨同樣的問題試圖做到這一點)。

+1

「我面臨着同樣的問題」 - 如果你真的說出了那個「同樣的問題」是什麼,以及你有什麼問題,你的問題會好得多。 – WhozCraig

+0

我不推薦zmq作爲初學者框架。它封裝了套接字API以至於你不知道發生了什麼。另外它仍然丟失TCP通信中的第一條消息。相反,請使用boost asio。您將學習網絡IO的基本概念。 – rustyx

+0

在Zmq中,您可以在兩個線程之間共享上下文,但永遠不會*套接字。爲什麼不(在您的原始代碼中):'zmq :: context_t context(1); std :: thread t_send(Send,context);'? – cibercitizen1

回答

0

這裏是我是如何解決它:傳遞上下文作爲指針然後鑄造回ZMQ :: context_t

void Send(void* context) // To get messages from user and send them to the server 
{ 
    zmq::socket_t s(*(zmq::context_t*)context,ZMQ_REQ); 
    s.connect ("tcp://192.168.1.84:5555"); 
    ... 
    ... 
} 

int main() 
{ 
    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1); 
    std::thread t_send(Send, static_cast<void*>(context.get())); 
    ... 
    return 0; 
} 

希望它可以幫助別人的未來。

0

你可以在zmqHelper找到一些樣品。有一個聊天的例子,許多線程通過inproc套接字(共享上下文)進行通信,還有一個帶有worker的服務器(也通過inproc連接)。