2016-03-22 19 views
-1

boost.asioとUDPを使用してクライアントを区別するにはどうすればよいですか。ブーストのすべての例では、一度に1つのリモートエンドポイントを保持するためにメンバー変数を使用します。私はエンドポイントのリストを保持し、到着時に受信したデータをどのオブジェクトに送信するかを決定する必要があります。私は現在、ブーストアシオを使用してクライアントを区別する

void Receive() { 
     boost::asio::ip::udp::endpoint client_endpoint; 
     char data[32]; 
     socket_.async_receive_from(boost::asio::buffer(data, 32), client_endpoint, 
      boost::bind(&MyClass::onReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 
    } 

このようなコードを持っていますが、これは私がから受け付けており、初めての場合は client_endpointは、ハンドラ関数に(使用できない)範囲の外に行こう、と私は新しい Clientオブジェクトを作成したいですそうでない場合は、適切なクライアントオブジェクトを更新します。

私はstd::set<boost::ip::udp::endpoint> client_sessions_;をメンバー変数として自分のサーバーに保持することを考えていましたが、client_endpointは非同期呼び出しがディスパッチされるまではまだ埋められません。

どうすれば対応できますか?

答えて

1

shared_ptrにエンドポイントを置くことができます。また、asio :: bufferにバグがあります - async_receive_fromは既にスタックしていた関数のスタックに書き込みを行い、おそらくスタックを破壊します。私は、コールバックのシグネチャを変更することができます知らなかった

void Receive() { 
     auto client_endpoint = std::make_shared<boost::asio::ip::udp::endpoint>(); 
     std::shared_ptr<char> data(new char[32], std::default_delete<char[]>()); 
     socket_.async_receive_from(boost::asio::buffer(data.get(), 32), *client_endpoint, 
      boost::bind(&MyClass::onReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, data, client_endpoint)); 
    } 
    //... 
    void MyClass::onReceive(boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, std::shared_ptr<char> data, std::shared_ptr<boost::asio::ip::udp::endpoint> client_endpoint); 

それとも、新しい/

+0

(あまり好ましくない)簡単にするために、削除を使用することができます。正しいスニペットのようなものでなければなりません – shane

関連する問題