2012-05-26 36 views
6

Có vẻ là một vấn đề mà nhiều người có, nhưng tất cả các câu trả lời tôi đã tìm thấy cho đến nay vẫn không giúp được gì.Lắng nghe phát sóng udp với thư viện tăng cường

Sự cố: Tôi đang cố gắng nghe một Velodyne HDL32 gửi gói dữ liệu qua UDP tới máy của tôi. Hệ điều hành là thư viện Ubuntu và Boost 32 bit v1.46.

Các dữ liệu tôi nhận được qua Wireshark trông như thế này:

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

Nhưng với mã này, không có dữ liệu được hiển thị với tôi (Port là đúng):

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

bất cứ ai có thể xác định một vấn đề cho đến nay hay bạn cần thêm thông tin? Tôi đánh giá cao bất kỳ trợ giúp nào tôi có thể nhận được.

LƯU Ý: Tôi KHÔNG chạy chương trình có đặc quyền root!

Vài suy nghĩ: Nó có thể được có thể là tăng :: ASIO :: ip :: address_v4 :: bất kỳ() sẽ không lắng nghe những IP .. *. 255 khi có subnetmask 255.255.255.0?

Khi sử dụng netcat, không có dữ liệu nào được hiển thị. Khi tôi sử dụng Windows netcat nó hoạt động khá tốt. Tương tự với Wireshark trên Linux và Windows - hoạt động tốt. Đã thử với nó, nhưng với cùng một hiệu ứng - không có dữ liệu.

+0

Ứng dụng có gửi dữ liệu Multicast cho bạn không? Nếu vậy, hãy thử mà không ràng buộc với điểm cuối nghe. – Chad

+0

Bạn có gọi io_service :: run() không? Bạn đã chỉ hiển thị một đoạn mã của bạn vì vậy tôi phải hỏi. – Sean

+0

@Sean io_service.run() được gọi trong hàm chính. Chương trình hoạt động tốt khi nhận dữ liệu trên một IP cụ thể và một cổng cụ thể. Nhưng không có dữ liệu nào được nhận khi tôi cố gắng nghe phát sóng –

Trả lời

2

Cảm ơn tất cả các bạn đã cố gắng giúp đỡ tôi. Mã đã được tất cả các quyền, nhưng vấn đề là trên mặt của velodyne và các mạng với nó.

Giải thích cho tất cả những người khác cố gắng làm việc với một VELODYNE:

Các VELODYNE có nó subnetwork riêng (192.168.17.x). Tất cả dữ liệu được ghi lại giờ đây được gửi tới mạng con 192.168.3.x bằng cách phát sóng. Trong những trường hợp bình thường, dữ liệu sẽ được nhận trên tất cả các IP trong mạng con này, nhưng điều này dường như không thể thực hiện được. IP duy nhất bạn có thể nhận dữ liệu là IP 255 và chỉ khi bạn sử dụng một trong hai giải pháp này. (Hoặc sử dụng cửa sổ hoặc đổ một tập tin với Wireshark)

1. Các ngu ngốc nhưng làm việc giải pháp

Đặt cửa ngõ vào 192.168.3.1. Có không có, nhưng nó không quan trọng. Từ bây giờ một trong những bạn sẽ nhận được dữ liệu trên IP 255.

2. Các giải pháp sạch

Đặt một con đường mới dẫn tất cả lưu lượng từ các subnet của VELODYNE đến 192.168.3.x. subnet

Tôi thực sự không biết tại sao nó lại quá phức tạp, nhưng chúng tôi mất khá nhiều thời gian để khám phá "bí mật" này. Hy vọng rằng một số bạn sẽ kiếm lời từ công việc khó tính của chúng tôi.

0

Bạn đã thử đặt tùy chọn phát sóng chưa?

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

thx BatchyX cho câu trả lời, nhưng khi tôi nhìn tùy chọn này lên nó nói: "Tùy chọn ổ cắm cho phép gửi tin nhắn quảng bá." Nhưng tôi cần nhận dữ liệu để không gửi bất kỳ thông tin nào. –

+0

Với tôi, mã nguồn cho biết nó cho phép SO_BROADCAST, cần thiết trên linux để nhận dữ liệu phát sóng. – BatchyX

Các vấn đề liên quan