2012-05-26 22 views
6

के साथ एक udp प्रसारण को सुनना कई लोगों के पास एक समस्या है, लेकिन अब तक के सभी उत्तरों को मैंने मदद नहीं की है।बूस्ट लाइब्रेरी

समस्या: मैं एक Velodyne HDL32 कि मेरे पीसी के लिए यूडीपी के माध्यम से अपने पैकेट भेजता है को सुनने के लिए कोशिश कर रहा हूँ। ओएस 32-बिट उबंटू और बूस्ट लाइब्रेरी v1.46 है।

डेटा मैं Wireshark के माध्यम से मिलता है इस प्रकार है:

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

लेकिन इस कोड के साथ, कोई डेटा मेरे लिए दिखाया गया है (पोर्ट सही है):

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

किसी को भी एक समस्या की पहचान कर सकते हैं अब तक या आपको अधिक जानकारी चाहिए? मैं जो भी सहायता प्राप्त कर सकता हूं उसकी सराहना करता हूं।

नोट: मैं रूट विशेषाधिकारों के साथ प्रोग्राम नहीं चला रहा हूं!

कुछ विचार: यह संभव हो सकता है कि बढ़ावा :: asio :: आईपी :: address_v4 :: किसी भी() आईपी नहीं सुनेगा।। * 255 जब सबनेटमास्क 255.255.255.0 है?

नेटकैट का उपयोग करते समय, कोई डेटा भी दिखाया नहीं जाता है। जब मैं विंडोज नेटकैट का उपयोग करता हूं तो यह काफी ठीक काम करता है। लिनक्स और विंडोज़ पर वायरशर्क के साथ ही - ठीक काम करता है। ने इसे साथ भी कोशिश की, लेकिन उसी प्रभाव के साथ - कोई डेटा नहीं।

+0

आप के लिए मल्टीकास्ट डेटा भेजने आवेदन है? यदि ऐसा है, तो सुनो एंडपॉइंट को बाध्य किए बिना प्रयास करें। – Chad

+0

क्या आपने io_service :: run() को कॉल किया था? आपने केवल अपने कोड का एक टुकड़ा दिखाया है इसलिए मुझे पूछना है। – Sean

+0

@Sean io_service.run() मुख्य समारोह में कहा जाता है। एक विशिष्ट आईपी और एक विशिष्ट बंदरगाह पर डेटा प्राप्त करते समय कार्यक्रम ठीक काम कर रहा है। लेकिन कोई डेटा प्राप्त होता है जब मैं प्रसारित करने के लिए –

उत्तर

2

मेरी मदद करने के लिए आपकी सभी कोशिश करने के लिए धन्यवाद। कोड ठीक था, लेकिन समस्या velodyne और नेटवर्कसेटिंग के पक्ष में थी। अन्य सभी जो एक Velodyne के साथ काम करने की कोशिश के लिए

स्पष्टीकरण: यह खुद सबनेटवर्क (192.168.17.x) है

VELODYNE है। सभी रिकॉर्ड किए गए डेटा अब प्रसारण द्वारा सबनेटवर्क 192.168.3.x को भेजते हैं। सामान्य परिस्थितियों में डेटा को इस सबनेट में सभी आईपी पर प्राप्त किया जाना चाहिए, लेकिन ऐसा संभव नहीं है। एकमात्र आईपी जिसे आप डेटा प्राप्त कर सकते हैं वह आईपी 255 है और यह कि अगर आप इन दो समाधानों में से एक का उपयोग करते हैं। (या उपयोग खिड़कियों या wireshark के साथ एक फ़ाइल डंप)

1. बेवकूफ लेकिन काम कर समाधान

192.168.3.1 करने के लिए एक प्रवेश द्वार निर्धारित करें। हां कोई नहीं है, लेकिन इससे कोई फर्क नहीं पड़ता। अब एक से आप आईपी 255.

2. साफ समाधान

एक नया मार्ग सेट कि सबनेट 192.168.3.x. को VELODYNE की सबनेट से सभी यातायात के लिए सुराग पर डेटा प्राप्त होगा

मुझे सच में नहीं पता कि यह इतना जटिल क्यों है, लेकिन हमें इस "गुप्त" को खोजने में काफी समय लगा। उम्मीद है कि आप में से कुछ हमारे परिष्कृत नौकरी से लाभान्वित होंगे।

0

क्या आपने प्रसारण विकल्प सेट करने का प्रयास किया है?

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

thx बैचिक्स, लेकिन जब मैंने यह विकल्प देखा तो यह कहता है: "सॉकेट विकल्प प्रसारण संदेशों को भेजने की अनुमति देने के लिए।" लेकिन मुझे डेटा भेजने की आवश्यकता है कि वह कोई भी न भेजें। –

+0

मेरे लिए, स्रोत कोड कहता है कि यह SO_BROADCAST को सक्षम करता है, जो लिनक्स पर प्रसारण डेटा प्राप्त करने के लिए आवश्यक है। – BatchyX

संबंधित मुद्दे