C++では、私はZeroMQを使って簡単なクライアント/サーバーチャットアプリケーションを構築しています。コンテキストがメインで初期化されたら、スレッドに渡して、ユーザのメッセージを出力するためにソケットを宣言します(つまり、を実行するにはを送信します)。私はスレッドを参照して、コンテキストを渡すためにしようとしているスレッドに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では、2つのスレッド間でコンテキストを共有することはできますが、決して*ソケットを共有することはできません。なぜ、元のコードでは、 'zmq :: context_t context(1); std :: thread t_send(送信、コンテキスト); – cibercitizen1