Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Υπάρχει τρόπος να ξέρω αν ένα network connection έχει κλείσει?

Îåêßíçóå áðü ôï ìÝëïò mod. Τελευταία δημοσίευση από το μέλος mod στις 14-07-2006, 16:37. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-07-2006, 19:56 14481

    Υπάρχει τρόπος να ξέρω αν ένα network connection έχει κλείσει?

    Καταρχήν χαιρετώ άπαντες, καθώς είναι η πρώτη φορά που γράφω στο φόρουμ.

    Τις τελευταιες μερες γράφω μια Client-Server εφαρμογή σε C# και χρειάζομαι τη βοήθειά σας.
    Το πρόβλημά μου είναι το εξής: Προσπαθώ να βρω ένα τρόπο να διαπιστώσω αν η εφαρμογή στην άλλη
    άκρη έχει 'πεθάνει' ή απλά έχει κάνει disconnect. Μιλάω για επικοινωνία πάνω από Tcp Connection.

    Καταρχήν το Socket δεν διαθέτει κάποιο ανάλογο event ώστε να ενημερώσει ότι κάτι τρέχει. To Connected
    property του παραμένει true ακόμα και αν έχει τερματιστεί η εφαρμογή-cliεnt. Το ίδιο συμβαίνει και με το
    NetworkStream που παίρνω από τον αντίστοιχο TcpClient, στο οποίο αν καλέσω τη μέθοδο ReadByte()
    παίρνω πίσω -1. Δοκίμασα να κάνω Poll για SelectError & SelectWrite στο socket αλλά πάλι no luck. Το να
    κάνω Poll για SelectRead δεν έχει νόημα, καθώς σύμφωνα με το documentation, θα επιστρέψει:
    "

    Mode

    Return Value

    SelectRead

    true if Listen has been called and a connection is pending;

    -or-

    true if data is available for reading;

    -or-

    true if the connection has been closed, reset, or terminated;

    otherwise, returns false.

    "

    Για να μην μακρυγορώ, υπάρχει κάποιος τρόπος να γίνει αυτό που προσπαθώ?
  •  06-07-2006, 23:49 14490 σε απάντηση της 14481

    Απ: Υπάρχει τρόπος να ξέρω αν ένα network connection έχει κλείσει?

    Νομίζω πως κάτι βρήκα. Έβαλα ένα άλλο thread να κάνει περιοδικά Poll με SelectRead και αν επιστρέψει true (που σημαίνει οτι ενδεχομένως έχει κλείσει η σύνδεση) κάνω

    if(socket.Receive(buffer, 0, 1, SocketOptions.Peek, out error) <= 0)

    {

    //the connection has closed, ...

    }


    Το πρόβλημα τώρα είναι οτι παρά το γεγονός οτι χρησιμοποιώ Peek αν εκείνη την ώρα το κύριο thread διαβάζει παρατήρησα οτι μου τρώει bytes από το Stream. Καμιά ιδέα?
  •  08-07-2006, 03:01 14522 σε απάντηση της 14490

    Απ: Υπάρχει τρόπος να ξέρω αν ένα network connection έχει κλείσει?

    Δοκίμασε να lock-άρεις το input stream του socket πρίν απο κάθε προσπάθεια να διαβάσεις απο αυτό, και για όλη τη διάρκειά της.



    Angel
    O:]
  •  08-07-2006, 13:57 14528 σε απάντηση της 14522

    Απ: Υπάρχει τρόπος να ξέρω αν ένα network connection έχει κλείσει?

    Τελικά έβαλα locks γύρω από κάθε ενεργεια πάνω στα sockets αλλά το πρόβλημα δεν προκύπτει απο κει. Στις μεταφορές μικρών πακέτων δεν υπάρχει κανένα πρόβλημα.

    Είτε όμως κάνω αυτό τον έλεγχο για το αν έχει πέσει η σύνδεση είτε όχι διαπίστωσα οτι αν πάω να διαβάσω κάτι (μεταφέρω αρχεία με ένα δικό μου πρωτόκολλο) που έχει μέγεθος πάνω από 8Μ με κάποιο τρόπο χάνονται 68 bytes και τώρα προσπαθώ να καταλάβω τι ακριβώς είναι αυτό που χάνεται. Μάλλον θα σώσω σε άλλο αρχείο αυτό που φτάνει στην άλλη μεριά και θα κάνω diff.
  •  14-07-2006, 16:37 14756 σε απάντηση της 14481

    Απ: Υπάρχει τρόπος να ξέρω αν ένα network connection έχει κλείσει?

    Τελικά βρήκα τι έφταιγε, ηταν δικό μου bug στην καταμέτρηση των δεδομένων που ήρθαν από το socket. Η τεχνική που χρησιμοποίησα πιο πάνω με το Poll & Receive λειτουργεί σωστά.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems