Boost Asio UDP Timeout



  • Hallo,

    Ich habe ein Programm geschrieben, welches per UDP mit einem Controller kommuniziert. In den meisten Fällen funktioniert alles tadellos. Nach unvorhersagbarer Zeit hängt das Programm und liefert nach noch längerer Wartezeit eine "unhandled exception". Was das heißt ist mir klar. Allerdings weiß ich nicht was ich besser machen soll. Hängen tut das Programm an der letzten Zeile folgenden (relavanten teil)Codes:

    io_service = new boost::asio::io_service;
    resolver = new boost::asio::ip::udp::resolver(*io_service);
    query = new boost::asio::ip::udp::resolver::query(boost::asio::ip::udp::v4(), "192.168.xxx.xxx", "PORT");
    receiver_endpoint = new boost::asio::ip::udp::endpoint(*resolver->resolve(*query));
    socket = new boost::asio::ip::udp::socket(*io_service);
    socket->open(boost::asio::ip::udp::v4());
    sender_endpoint = new boost::asio::ip::udp::endpoint();
    
    socket->send_to(boost::asio::buffer(send_buf), *receiver_endpoint);
    size_t len = socket->receive_from(boost::asio::buffer(recv_buf), *sender_endpoint);
    

    Nach Recherche im Internet kann ich das Problem auf ein fehlendes timeout zurückführen. In den dort genannten Beispielen wurde async mit ASIO genannt, ich wurde aus den Beispielen allerdings nicht so recht schlau.
    Ich habe erst vor kurzem mit Boost angefangen und hoffe ihr könnt mir helfen.

    EDIT: Ich hoffe mit Boost eine Platformunabhängige Lösung zu finden. Sollte das nicht möglich sein würde auch eine Windows kompatible Lösung reichen. Als Compiler wird momentan Visual Studio 10 benutzt. In Zukunft könnte auch eine Linux Lösung mit gcc folgen.



  • Schon mal probiert, es erstmal einfach zu gestalten, also der klassische Weg mit select, sendto und recvfrom. Ich denke nicht, dass der Performanceverlust ins Gewicht faellt.



  • Ich wollte die WinAPI meiden, da die Überlegung besteht das Programm auf andere Plattformen zu übertragen. Zu diesem Zweck ist bisher nur Qt und Boost verwendet wurden.



  • Das sind eine ganze Menge new's und ich bezweifele das du die brauchst und auch richtig mit umgehst. Du kannst alles wunderbar auf den Stack packen. Wenn du ein UdpSocket mit recv-timeout brauchst, dann orientiere dich hiernach: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp03/timeouts/blocking_udp_client.cpp



  • akirahinoshiro schrieb:

    Ich wollte die WinAPI meiden, da die Überlegung besteht das Programm auf andere Plattformen zu übertragen. Zu diesem Zweck ist bisher nur Qt und Boost verwendet wurden.

    Du hast keine Ahnung. select, recvfrom, sendto .. ist POSIX, d.h. ist auf fast allen unixoiden Betriebssystemen zu finden und unter Windows. Unter Windows muss man nur ein zusaetzliches WSAStartup machen. Hier sind die Basics: http://beej.us/guide/bgnet/



  • Das kann ich leider (noch) nicht abstreiten. Gibt es irgendwelche Fallstricke über die man bei Sockets noch stolpern könnte?


Anmelden zum Antworten