2016-08-21 19 views
2

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を渡しても問題ありませんが、同じことをやろうとしています)。ここで

+1

"私は同じ問題に直面しています" - あなたが実際にその「同じ問題」が何であるか、そしてあなたがその問題を抱えていることを実際に述べると、あなたの質問はかなり良くなります。 – WhozCraig

+0

私はzmqをスターターフレームワークとして推奨しません。それは、あなたが何が起こっているのか分からないほど多くのソケットAPIをラップします。それはまだTCP通信の最初のメッセージを失う。代わりにboost asioを使用してください。ネットワークIOにとって基本的な概念を学びます。 – rustyx

+0

Zmqでは、2つのスレッド間でコンテキストを共有することはできますが、決して*ソケットを共有することはできません。なぜ、元のコードでは、 'zmq :: context_t context(1); std :: thread t_send(送信、コンテキスト); – 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ソケットを介して通信する多くのスレッド(コンテキストの共有)、ワーカー(inprocによっても接続されている)を持つサーバーの例があります。

関連する問題