To network programming δεν είναι κάτι απλό - το πάραδειγμα που έδωσες ουσιαστικά περιγράφει τον τρόπο που προσπαθείς να υλοποιήσεις εσύ την λύση του προβλήματος. Καταλαβαίνεις, ότι όταν δεν ξέρουμε το πρόβλημα δεν μπορούμε να σου δώσουμε την καλύτερη λύση.
Παρόλα αυτά, πρώτα πρέπει να κατανοήσεις τον τρόπο που δουλεύει μια TCP επικοινωνία, για να μπορέσεις να το κάνεις την υλοποίηση:
- Ο server κάνει listen σε κάποιο συγκεκριμένο port - πρέπει να έχει καθοριστεί ο αριθμός του port.
- Ο client μπορεί να κάνει request στον server για να συνδεθεί στο συγκεκριμένο port - πρέπει να ξέρει την διεύθυνση του server και το port που θέλει να συνδεθεί.
- Ο server έχει τις εξής επιλογές εκείνη την στιγμή:
- να ανοίξει την επικοινωνία στο ίδιο port που κάνει listen για να λάβει δεδομένα,
- να ανοίξει ένα άλλο νέο port, να προωθήσει το request στο νέο port και να ανοίξει την επικοινωνία στο νέο port,
- να απορρίψει το request και να μην έχουμε ποτέ επικοινωνία
- Αν υποθέσουμε ότι ο server ανοίξει ένα port, τότε δέχεται τα δεδομένα που στέλνει ο client.
- Ο αριθμός των read των δεδομένων που φτάνουν στο port του server, μπορεί να είναι παραπάνω από 1 - μπορεί να χρειαστεί να γίνουν πολλαπλά reads για να διαβαστούν τα δεδομένα που θα φτάσουν - το μέγεθος των δεδομένων που φτάνουν στο port, εξαρτάται από το MTU του δικτύου, συνήθως 1500 ή μικρότερο αν μιλάμε για Ethernet δίκτυα που παίζουν μέ NAT ή VPN και ακόμη μικρότερο, γύρω στα 500 αν δεν κάνω λάθος, για δίκτυα πάνω από τηλέφωνο.
- Αφού ο server, λάβει όλα τα δεδομένα - συνήθως το καταλαβαίνει από κάποια ακολουθία χαρακτήρων/bytes στα δεδομένα που φτάνουν - τα επεξεργάζεται και στέλνει την απάντησή του από το port που έχει κάνει την λήψη των δεδομένων.
- Κανονικά σε μια TCP διαδικασία, αφού θα έκλεινε μια ακολουθία αποστολής/απάντησης, ο server θα κλείσει αυτόματα το port που άκουσε/απάντησε.
- Ο client όταν καταλάβει ότι ο server του έκλεισε το port θα κλείσει και αυτός το δικό του, και τότε η επικοινωνία έχει τελιώσει
Φαντάζομαι, ότι καταλαβαίνεις ότι να ζητάς να υλοποιήσεις κάτι τέτοιο δεν είναι απλό, του στυλ άνοιξε/διάβασε/απάντησε/κλείσε.
Παραδείγματα των παραπάνω μπορείς να βρεις στο MSDN, για το server κομμάτι στο TcpListener Class, ενώ για το client κομμάτι στο TcpClient Class.
Αν θέλεις να φτιάξεις κάτι που θα έχει αξιόπιστη επικοινωνία, καλύτερα να χρησιμοποιήσεις ένα application protocol - το http για παράδειγμα και ένα webservice - που λύνει από μόνο του το πρόβλημα της υλοποίησης της TCP επικοινωνίας. Έτσι εσύ θα μπορείς να ασχοληθείς με τα δεδομένα που λαμβάνονται, πως θα επεξεργαστούν, και τι θα περιέχει η απάντηση του server.
George J.