2012-05-26 78 views
6

Birçok insanın sahip olduğu bir sorun gibi görünüyor, ancak şimdiye kadar bulduğum tüm yanıtlar işe yaramadı.Destek kitaplığı ile bir udp yayını dinleme

Sorun: benim pc UDP yoluyla kendi paketlerini gönderen bir VELODYNE HDL32 dinlemeye çalışıyorum . İşletim sistemi, 32 bit Ubuntu ve Boost kütüphanesi v1.46'dır.

i Wireshark aracılığıyla olsun veri şuna benzer:

Time  | Source   | Destination | Protocol | Length | Source Port | Destination Port 
0.000000 | 192.168.17.212 | 192.168.3.255 | UDP  | 1248 | https  | opentable 

Ama bu kod ile hiçbir veri bana gösterilen

(Liman doğrudur):

receiver(boost::asio::io_service& io_service, 
    const boost::asio::ip::address& listen_address) 
: m_socket(io_service) 
{ 

boost::asio::ip::address ipAddr = boost::asio::ip::address_v4::any(); 
boost::asio::ip::udp::endpoint listen_endpoint(
     ipAddr, 2368); 

m_socket.open(listen_endpoint.protocol()); 
m_socket.bind(listen_endpoint); 

m_socket.async_receive_from(
    boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
    boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

void handle_receive_from(const boost::system::error_code& error, 
    size_t bytes_recvd) 
{ 
std::cout << "receive" << bytes_recvd << std::endl; 


    m_socket.async_receive_from(
     boost::asio::buffer(m_data, max_length), m_sender_endpoint, 
     boost::bind(&receiver::handle_receive_from, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::bytes_transferred)); 
} 

herkes bir sorunu tanımlamak Can şu ana kadar veya daha fazla bilgiye mi ihtiyacınız var? Alabileceğim herhangi bir yardımı takdir ediyorum.

NOT: Programı root yetkisiyle çalıştırmıyorum!

Bazı düşünceler: mümkün olabilir o boost :: asio :: ip :: address_v4 :: herhangi() IP dinlemeyeceğim. 255.255.255.0 alt ağ maskesine sahipken. Netcat kullanıldığında, hiçbir veri gösterilmemiştir. Windows netcat kullandığımda oldukça iyi çalışıyor. Linux ve Windows'taki Wireshark ile aynı - iyi çalışıyor. Aynı zamanda, aynı etkiyle - veri yok.

+0

Uygulama size çok noktaya yayın verileri gönderiyor mu? Eğer öyleyse, dinleme uç noktasına bağlanmadan deneyin. – Chad

+0

io_service :: run()? Adlı kullanıcıyı aradınız mı? Sadece kodunuzun bir parçasını gösterdin, böylece sormam gerek. Ana işlevde – Sean

+0

@Sean io_service.run() çağrılır. Program belirli bir IP ve belirli bir bağlantı noktasında veri alırken iyi çalışıyor. Ancak yayın dinlemeye çalıştığımda hiçbir veri alınmadı –

cevap

2

Bana yardım etmeye çalıştığınız için hepinize teşekkür ederim. Kod iyiydi, ama problem velodyne'nin yanında ve onunla iletişim kuruyordu. Bir VELODYNE çalışmak deneyin tüm diğerleri için

Açıklama:

VELODYNE sahiptir kendi alt ağ (192.168.17.x) bulunuyor. Kaydedilen tüm veriler şimdi yayın yoluyla 192.168.3.x alt ağına gönderilir. Normal koşullar altında, bu alt ağdaki tüm IP'lerde veri alınmalıdır, ancak bu mümkün görünmemektedir. Verileri alabileceğiniz tek IP IP 255'tir ve bu iki çözümden birini kullanırsanız. (Ya kullanım pencereler veya wireshark içeren bir dosya dökümü)

1. aptal ama çalışma çözüm

192.168.3.1 bir ağ geçidi olarak ayarlayın. Evet yok, ama önemli değil. biri Bundan sonra IP 255.

2. alt ağ 192.168.3.x. için VELODYNE ait alt ağdan tüm trafiği açan yeni bir rota ayarlayın temiz çözüm

verileri alacak

Gerçekten neden bu kadar karmaşık olduğunu bilmiyorum ama bu "sırrı" keşfetmemiz biraz zaman aldı. Umarım bazılarınız bizim finiel işimizden faydalanır.

0

Yayın seçeneğini ayarlamayı denediniz mi?

// do this before binding 
boost::asio::socket_base::broadcast option(true); 
m_socket.set_option(option); 
+0

thx BatchyX, ancak bu seçenek yukarı baktığımda şöyle diyor: "Yayın mesajlarının gönderilmesine izin vermek için soket seçeneği." Ama herhangi bir veri göndermemem gerekiyor. –

+0

Bana göre, kaynak kodu yayın verilerini almak için linux üzerinde gerekli olan SO_BROADCAST'i etkinleştirdiğini söylüyor. – BatchyX

İlgili konular