[QT + Linux + C++] Disconnessione, ma chi se ne accorge?

di il
1 risposte

[QT + Linux + C++] Disconnessione, ma chi se ne accorge?

Salve, sto scrivendo un'applicazione per linux in C++ usando le librerie Qt, il mio problema è che, quando due istanze (un client e un server) stanno comunicando via rete e io tolgo fisicamente il cavo di rete non viene lanciato nessun segnale e per essere esatti il socket rimane aperto senza curarsi del fatto che la connessione non esiste + infatti nel momento in cui ricollego il cavo anche dopo 10 minuti tutti i messaggi vengono spediti correttamente; io vorrei invece avvertire l'utente che la connessione è stata interrotta.
Mi è stato consigliato di usare QtDbus però devo scartare la soluzione perchè l'applicativo che sto scrivendo deve funzionare sia su linux che su Wincoz e Mac (ora usando QSocket funziona su tutti e tre i sistemi operativi).

Esiste una soluzione o devo per forza fare un branch solo per linux?

Grazie!

Hola

1 Risposte

  • Re: [QT + Linux + C++] Disconnessione, ma chi se ne accorge?

    Ciao, anche se non ho nessuna esperienza di programmazione di rete cn le qt, posso cercare di aiutarti rifacendomi alla programmazione in ansi c.
    In questo caso se ho due processi che comunicato mediante una soket di rete e voglio sapere quando la comunicazione viene interrotta per un guasto al cavo (oppure perché il cavo glielo togli) si usa la primitiva send.. Ti riporto sotto la primitiva:
    int send (int socket, const void * msg, int len, unsigned int flags)
    dove il parametro flags rappresenta la maschera di gestione degli errori da settare come un or bit a bit dei seguenti parametri:
    MSG_OOB
    MSG_DONTWAIT
    MSG_NOSIGNAL
    se imposti il flags su msg_dontwait rendi l'invio dei dati non bloccante in caso di errore. Quindi se stacchi il cavo la send restituisce il valore -1 e vengono inviati solo i byte del tuo messaggio antecedenti il guasto.
    C'è anche da tenere conto che se stacchi "britalemente" il cavo di rete molto probabilmente il processo che invia i dati solleverà un'eccezione di tipo SIGPIPE prima di andare in segmentation fault.
    In questo caso devi impostare il flags su msg_nosignal che permette al tuo processo di sopravvivere all'improvviso crash del socket e permette alla send di restituire -1 settando la variabile errno a EPIPE. Successivamente così puoi gestire l'errore.

    Di certo il secondo metodo è il migliore perché puoi gestire qualsiasi errore del socket. Spero di esserti stato d'aiuto. Ciao..
Devi accedere o registrarti per scrivere nel forum
1 risposte