在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也很好,但我面臨同樣的問題試圖做到這一點)。
「我面臨着同樣的問題」 - 如果你真的說出了那個「同樣的問題」是什麼,以及你有什麼問題,你的問題會好得多。 – WhozCraig
我不推薦zmq作爲初學者框架。它封裝了套接字API以至於你不知道發生了什麼。另外它仍然丟失TCP通信中的第一條消息。相反,請使用boost asio。您將學習網絡IO的基本概念。 – rustyx
在Zmq中,您可以在兩個線程之間共享上下文,但永遠不會*套接字。爲什麼不(在您的原始代碼中):'zmq :: context_t context(1); std :: thread t_send(Send,context);'? – cibercitizen1