boost::asio async_read timeout



  • Hallo

    Wie kann ich realisieren, dass die async_read Funktion nicht ewig auf daten wartet? Unter Windows XP kann ich ja nicht in dem Handler von einem deadline_timer socket::cancel() aufrufen. Gibt's da einen anderen Ansatz? Den io_service darf ich auch nicht stoppen, weil sonst bei den anderen Thrads die run() Funktion vorzeitig zurückehrt.

    Danke...



  • shutdown auf dem socket aufrufen (für die empfangsseite).



  • theta schrieb:

    shutdown auf dem socket aufrufen (für die empfangsseite).

    Muss ich das vor dem nächsten Receive-Vorgang irgendwie rückgängig machen?



  • Ich denke ich habe dich falsch verstanden.
    shutdown(..) sollst Du nur benutzen, wenn Du die Verbindung herunterfahren willst (=Socket schliessen).

    Warum möchtest Du nicht, dass async_read solange waretet bis eben Daten anliegen oder die Verbindung heruntergefahren wird?

    Bräuchtest Du ein (blockierendes) read mit timeout?



  • theta schrieb:

    Bräuchtest Du ein (blockierendes) read mit timeout?

    Ja, genau. Read und write mit timeout, und keines soll das andere blockieren.
    Ich möchte so ein Interface erreichen:

    // Versteckt
    struct ConnectionImpl
    {
    	boost::asio::io_service io_service;
    	boost::asio::ip::tcp::socket socket;
    	// etc.
    };
    
    // C Interface
    
    typedef void* Connection;
    
    int Open(Connection** con, const char* address, unsigned short port, int timeout_ms);
    
    int Close(Connection* con, int timeout_ms);
    
    // Read und Write können parallel in separaten Threads ablaufen
    
    int Write(Connection* con, const char* buf, size_t n, int timeout_ms);
    
    int Read(Connection* con, char* buf, size_t n, int timeout_ms);
    

    Eine Funktion soll entweder erfolgreich sein oden nach timeout_ms zurückkehren. Sollte ich vielleicht besser eine ander Lib benutzen?


Anmelden zum Antworten