2017-01-04 4 views
2

私はクライアントとサーバー用のプログラムを作成しました。プログラムは現在、次のん:接続 C++ - ASIOネットワーキングサーバー/クライアントをブーストする

  • クライアントが接続
  • クライアントがメッセージ
  • を受け取る受諾にメッセージを送信し、サーバ
  • サーバに接続するため

    1. Serverは、エンドポイントに耳を傾けます

      私はこれを非同期で行います。しかし、問題は、彼らは1つのメッセージを送受信しかできないということです。その後、彼らはただ終了する。以下は私のコードです:

      #include <iostream> 
      #include <vector> 
      #include<boost/asio.hpp> 
      
      std::vector<char> buff(256); 
      
      void SendHandler(boost::system::error_code ex){ 
          std::cout << " do something here" << std::endl; 
      } 
      
      void ReadHandler(boost::system::error_code ex){ 
          std::cout << " print the buffer data..." << std::endl; 
          std::cout << buff.data() << std::endl; 
      
      } 
      
      void Server(){ 
          boost::asio::io_service service; 
          using namespace boost::asio::ip; 
          tcp::endpoint endpoint(tcp::v4(), 4000); 
          tcp::acceptor acceptor(service, endpoint); 
          tcp::socket socket(service); 
          std::cout << "[Server] Waiting for connection" << std::endl; 
      
      
          acceptor.accept(socket); 
          std::cout << "[Server] Accepted a connection from client" << std::endl; 
      
          std::string msg = "Message from server"; 
          socket.async_send(boost::asio::buffer(msg), SendHandler); 
          service.run(); 
      
      } 
      
      void Client(){ 
          boost::asio::io_service service; 
          using namespace boost::asio::ip; 
          tcp::endpoint endpoint(address::from_string("127.0.0.1"), 4000); 
          tcp::socket socket(service); 
          std::cout << "[Client] Connecting to server..." << std::endl; 
          socket.connect(endpoint); 
          std::cout << "[Client] Connection successful" << std::endl; 
      
          socket.async_read_some(boost::asio::buffer(buff), ReadHandler); 
          service.run(); 
      } 
      
      int main(int argc, char **argv) { 
          if(argc == 1){ 
           std::cout << "Please specify s for server or c for client" << std::endl; 
           return -1; 
          } 
          if(argv[1][0] == 's'){ 
           Server(); 
          } 
          else{ 
           Client(); 
          } 
          return 0; 
      } 
      

      私はそのように、このプログラムを拡大したい:サーバが聞くことができ、クライアントが無期限にリクエストを送信することができます

      1. 。さらに、片方向チャットシステムのようなものです。
      2. サーバーは複数のクライアントに接続できます。

      async_send()service.run()を無限ループに入れても役に立ちませんでした。これは、クライアントが終了するまでクライアント側でメッセージを何度も表示するだけです。

      私もnetwork programmingboost::asioにかなり新しいです。私のコードでどこで何を修正すべきか教えてください。

  • 答えて

    2

    いくつかの基本を学ぶことから始めます。図書館が提供する優れたチュートリアルと例は、同期サーバーと非同期サーバーの両方の概念と例を紹介しています。

    http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio.html

    スタート冒頭に。タイマーとコールバックの基本的な概念を理解してください。ネットワークへのチュートリアルを続行してください。チュートリアルプログラムを編集して、自分のアイデアを試して、数時間にわたってコアアイデアを構築してください。

    次に、例のセクションに進みます。 「チャット」の例は、実際にビルドしようとしているものに近いです。この特定の例は、読み取りハンドラでasync_readsを再発行して接続をオープンする方法を示しています。非同期asioサーバは、割り当てられたasync_acceptタスクでサービススレッドが引き続き実行されている限り、複数のクライアントにサービスを提供します。

    http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/examples/cpp11_examples.html http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp

    関連する問題