2016-03-22 18 views
-1

Boost.asio ve UDP kullanarak istemcileri nasıl ayırt edebilirim? Tüm yükseltme örnekleri bir seferde bir uzak uç noktayı tutmak için bir üye değişkeni kullanır. Uç noktaların bir listesini tutmalı ve ulaşıldığında alınan veriyi hangi nesneye göndereceğime karar vermeliyim. Şu anda buİstemcileri asansörü kullanarak farklılaştırma

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)); 
    } 

ama client_endpoint gibi kod işleyici işlevine (bulunmayabilir) kapsam dışında gidecek var ve bu ben den alıyorum ilk kez ise yeni bir Client nesne oluşturmak istiyorum veya değilse uygun istemci nesnesini güncelleyin.

Sunucuya üye değişkeni olarak std::set<boost::ip::udp::endpoint> client_sessions_; tutmayı düşünüyordum, ancak async çağrısı gönderilinceye kadar client_endpoint hala doldurulmuyor.

Bunu nasıl yaparım?

cevap

1

Bitiş noktanızı shared_ptr'de tutabilirsiniz. Ayrıca, asio :: buffer - async_receive_from ile hatalarınız da var.

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); 

Ya

+0

ben callback'inde imzasını değiştirebilir bilmiyordum/yeni kullanmak (daha az tercih edilir) basitlik için silebilirsiniz: Doğru pasajı gibi bir şey olmalı – shane

İlgili konular