Asynchrone multi-directionele server-client communicatie via dezelfde open socket?

Asynchrone multi-directionele server-client communicatie via dezelfde open socket?

Toen ik een applicatie moest schrijven met een client-servermodel waarbij de clients konden vertrekken en binnenkomen wanneer ze maar wilden (ik neem aan dat dat ook het geval is voor jouw applicatie omdat je mobiele apparaten gebruikt), zorgde ik ervoor dat de clients een online bericht naar de server om aan te geven dat ze verbonden waren en klaar waren om te doen wat ze moesten doen.

op dat moment kon de server berichten terugsturen naar de client via dezelfde open verbinding.

Ook, maar ik weet niet of dat voor jou van toepassing is, had ik een soort hartslag de clients stuurden naar de server en lieten hem weten dat hij nog steeds online was. Op die manier weet de server wanneer een client geforceerd is losgekoppeld van het netwerk en kan hij die client weer als offline markeren.


Het gebruik van asynchrone communicatie is volledig mogelijk in single thread!

Er is een algemeen ontwerppatroon in de ontwikkeling van netwerksoftware, het reactorpatroon genoemd (zie dit boek). Een bekende netwerkbibliotheek biedt een implementatie van dit patroon (kijk naar ACE).

Kortom, de reactor is een object, je registreert al je stopcontacten erin, en je wacht op iets. Als er iets is gebeurd (nieuwe data binnen, verbinding verbroken...) zal de reactor je hiervan op de hoogte stellen. En natuurlijk kunt u maar één socket gebruiken om gegevens asynchroon te verzenden en te ontvangen.


Het is mij niet duidelijk of je de asynchrone bits wilt toevoegen aan de server in C# of de client in C++.

Als je het hebt over dit in C++ te doen, kunnen desktop Windows-platforms socket I/O asynchroon doen via de API's die overlappende I/O gebruiken. Voor sockets staan ​​WSASend en WSARecv beide asynchrone I/O toe (lees de documentatie over hun LPOVERLAPPED-parameters, die u kunt vullen met gebeurtenissen die worden ingesteld wanneer de I/O is voltooid).

Ik weet niet of Windows Mobile-platforms deze functies ondersteunen, dus het kan zijn dat je wat meer moet graven.