
Έχω μια εφαρμογή πελάτη-διακομιστή, όπου ο πελάτης είναι σε 6 συσκευή με Windows Mobile, γραμμένο σε C ++ και ο διακομιστής είναι σε πλήρη τα Windows και γραμμένο σε C #. 


Αρχικά, θα χρειαζόταν μόνο για να στείλετε μηνύματα από τον πελάτη στο διακομιστή, με το διακομιστή μόνο ποτέ στείλει πίσω μια απόδειξη ότι έλαβε το μήνυμα. Τώρα, θα ήθελα να την ενημερώσει, έτσι ώστε ο διακομιστής μπορεί να στείλει στην πραγματικότητα ένα μήνυμα στον πελάτη με τα στοιχεία της αίτησης. Όπως έχω σήμερα το ρυθμίσετε έτσι ώστε ο πελάτης είναι μόνο στη λειτουργία λήψης μετά την αποστολή δεδομένων στο διακομιστή, αυτό δεν επιτρέπεται για το διακομιστή για να στείλετε ένα αίτημα ανά πάσα στιγμή. Θα πρέπει να περιμένουμε για τα δεδομένα των πελατών. Η πρώτη μου σκέψη ήταν να δημιουργήσει ένα άλλο νήμα για τον πελάτη με ξεχωριστή ανοιχτή υποδοχή, ακούγοντας τα αιτήματα του server ... ακριβώς όπως ο διακομιστής έχει ήδη όσον αφορά την τον πελάτη. Υπάρχει ένας τρόπος, μέσα στο ίδιο νήμα και χρησιμοποιώντας την ίδια υποδοχή, σε όλες τις διακομιστή για την αποστολή των αιτήσεων ανά πάσα στιγμή;


Μπορείτε να χρησιμοποιήσετε κάτι για την επίδραση του `WaitForMultipleObjects()`και να περάσει ένα buffer λήψης και ένα γεγονός που λέει υπάρχουν δεδομένα προς αποστολή;

 
Ασύγχρονη επικοινωνία server-client πολλαπλών κατεύθυνση κατά την ίδια ανοιχτή υποδοχή;
=======================================================================================



Όταν είχα ανάγκη να γράψω μια εφαρμογή με ένα μοντέλο πελάτη-εξυπηρετητή, όπου οι πελάτες θα μπορούσαν να φύγουν και να εισάγετε όποτε θέλουν, (υποθέτω ότι είναι επίσης η περίπτωση για την εφαρμογή σας, όπως εσείς χρησιμοποιείτε φορητές συσκευές) που φρόντισε ώστε οι πελάτες να στείλετε ένα *σε απευθείας σύνδεση* μήνυμα στο διακομιστή, αναφέροντας ότι έχουν συνδεθεί και είναι έτοιμη να κάνει ό, τι χρειάζεται να κάνει.


εκείνη τη στιγμή ο server θα μπορούσε να στείλει μηνύματα πίσω στον πελάτη γούρνα την ίδια ανοικτή σύνδεση.


Επίσης, αλλά δεν ξέρω αν αυτό ισχύει για εσάς, είχα κάποια *αρρυθμία* οι πελάτες που αποστέλλονται στο διακομιστή, αφήνοντας το γνωρίζουν ακόμα ότι ήταν σε απευθείας σύνδεση. Με αυτόν τον τρόπο ο server ξέρει πότε ένας πελάτης ήταν βίαια αποσυνδεθεί από το δίκτυο και θα μπορούσε να σηματοδοτήσει ότι πελάτη πίσω και offline.

 

Δεν είμαι σαφής σχετικά με το εάν ή όχι είστε θέλοντας να προσθέσετε τις ασύγχρονη bits στο διακομιστή σε C # ή τον πελάτη σε C ++.


Αν μιλάμε για να γίνει αυτό σε C ++, desktop πλατφόρμες των Windows μπορεί να κάνει την υποδοχή I / O ασύγχρονα μέσω του API του εν λόγω χρήση επικαλύπτονται I / O. Για πρίζες, WSASend, WSARecv τόσο επιτρέψει ασύγχρονη I / O (διαβάστε την τεκμηρίωση σχετικά με τις παραμέτρους LPOVERLAPPED τους, τα οποία μπορείτε να συμπληρώσετε με τα γεγονότα που ετοιμαστείτε όταν το I / O ολοκληρώνει).


Δεν ξέρω αν τα Windows Mobile πλατφόρμες υποστηρίζουν αυτές τις λειτουργίες, οπότε ίσως χρειαστεί να κάνετε κάποια επιπλέον σκάψιμο.

 

Αναχώρηση [ASIO](http://tenermerx.com/Asio/) . Είναι ένας σταυρός συμβατή C ++ βιβλιοθήκη για ασυγχρόνιστο IO. Δεν είμαι σίγουρος αν αυτό θα ήταν χρήσιμο για το διακομιστή (δεν έχω δοκιμάσει να συνδέσετε ένα πρότυπο C ++ DLL για να αγ # έργου), αλλά για τον πελάτη, θα ήταν χρήσιμο.


Το χρησιμοποιούμε μαζί με την αίτησή μας, και έλυσε τα περισσότερα από τα προβλήματά μας ταυτοχρονισμού IO.

 

Χρησιμοποιώντας ασύγχρονη επικοινωνία είναι απολύτως δυνατόν σε ενιαίο νήμα! 


Υπάρχει ένα κοινό πρότυπο σχεδιασμού στην ανάπτυξη λογισμικού δικτύου ονομάζεται το πρότυπο αντιδραστήρα ( [ματιά σε αυτό το βιβλίο](http://www.amazon.fr/Pattern-Oriented-Software-Architecture-Concurrent-Networked/dp/0471606952/ref=sr_1_9?ie=UTF8&s=english-books&qid=1218980593&sr=1-9) ). Μερικά πολύ γνωστή βιβλιοθήκη του δικτύου παρέχει μια εφαρμογή αυτού του προτύπου ( [δείτε ACE](http://www.cs.wustl.edu/~schmidt/ACE.html) ).


Εν συντομία, ο αντιδραστήρας είναι ένα αντικείμενο, μπορείτε να εγγραφείτε όλες τις πρίζες σας μέσα, και περιμένετε για κάτι. Αν κάτι συμβεί (νέα δεδομένα έφτασε, σύνδεση κλείσιμο ...) ο αντιδραστήρας θα σας ειδοποιήσει. Και φυσικά, μπορείτε να χρησιμοποιήσετε μόνο μία υποδοχή για την αποστολή και έλαβε τα δεδομένα ασύγχρονα.

 