Datagram-Größe von UDP mit Boost asio herausfinden



  • Hiho,

    ich möchte eine einfache UDP-Verbindung, wo die eine Instanz ein paar Floats an die andere schickt.
    Der Server ist einfach gestrickt:

    io_context service;
    udp::socket socket(service);
    socket.open(udp::v4());
    socket.bind(udp::endpoint(udp::v4(), 2306));
    
    udp::endpoint ep(boost::asio::ip::make_address(ip), port);
    
    ...
    
    std::array<float, 5> values;
    for(;;)
    {
        ...
    
        socket.send_to(boost::asio::buffer(values), ep);
    }
    

    Auf der anderen Seite sollen die Daten empfangen und ausgewertet werden. Soweit ich nun UDP verstanden habe, ist das Protokoll ja Datagram-basiert und nicht Stream-basiert (wie TCP). Das heißt, wenn ich ein write mache sollte auf der Gegenseite ein read genau das lesen, was ich gesendet habe (das Pakete verloren gehen können und Reihenfolge nicht garantiert ist, ist klar). Also in meinem Fall ich schreibe 5 floats, sollten auf der Gegenseite auch 5 floats in einem Datagram liegen.

    Wenn ich nun mit boost mir die verfügbaren Daten abrufe, kann ich aber wesentlich mehr abholen. Z. B. kann ich 3000 Bytes lesen, die ersten 20 enthalten meine 5 float-Werte und dann kommen noch massig Nullen dahinter?!?!

    Hier der verkürzte Code der Gegenseite:

    m_socket.open(udp::v4());		
    m_socket.bind(udp::endpoint(udp::v4(), 2307));
    		m_socket.connect(udp::endpoint(boost::asio::ip::make_address(m_ip), 2306));
    
    ...
    
    auto count = m_socket.available();
    values.resize(count / sizeof(float));
    m_socket.receive(boost::asio::buffer(values.data(), count ));
    

    available liefert mit eine wesentlich größere Anzahl an Bytes zurück, als meine Datagramgröße vom Sender. Woran liegt das? mache ich etwas falsch? An sich steht doch im UDP-Header die Größe des Datagrams drinnen. So wollte ich mir ersparen, die Größe erst noch mitsenden zu müssen oder eine feste Größe zu definieren (was unflexibel ist. Lese ich hart 20 Bytes, funktioniert es, aber ich hätte gerne die flexible Variante).

    VG


Log in to reply