Asynchronous multi-richting server-client communicatie over dezelfde open socket?

stemmen
20

Ik heb een client-server applicatie waarbij de klant is op een Windows Mobile 6-apparaat, geschreven in C ++ en de server is op de volledige Windows en geschreven in C #.

Oorspronkelijk, moest ik het alleen om berichten van de client naar de server, met de server alleen maar terug te sturen een bevestiging dat het bericht heeft ontvangen. Nu zou ik graag willen werken, zodat de server eigenlijk een bericht naar de klant kan sturen op het verzoek van de gegevens. Zoals ik momenteel het op te zetten, zodat de klant alleen in ontvangst modus nadat stuurt gegevens naar de server, dit niet mogelijk is voor de server een verzoek op elk gewenst moment te sturen. Ik zou moeten wachten voor client data. Mijn eerste gedachte zou zijn om een ​​andere thread op de client te maken met een aparte geopende socket, luisteren naar server verzoeken ... net als de server al heeft ten aanzien van de opdrachtgever. Is er een manier, binnen dezelfde thread en met dezelfde socket, om alle server verzoeken op elk gewenst moment te sturen?

Kun je iets aan het gebruik van invloed zijn van WaitForMultipleObjects()en doorgeven een buffer en een gebeurtenis die het vertelt er gegevens moeten worden verzonden te ontvangen?

De vraag is gesteld op 04/08/2008 om 14:52
bron van user
In andere talen...                            


4 antwoorden

stemmen
7

Asynchrone communicatie geheel kan in enkele thread!

Er is een gemeenschappelijk ontwerp patroon in het netwerk van de ontwikkeling van software genaamd de reactor patroon ( kijkje op dit boek ). Enkele bekende netwerk bibliotheek biedt een implementatie van dit patroon ( kijk naar ACE ).

In het kort, de reactor is een object, je binnen registreert al uw voeten, en je wacht op iets. Als er iets gebeurd (nieuwe gegevens aangekomen, aansluiting dicht ...) de reactor zal u op de hoogte. En natuurlijk, kunt u slechts één socket gebruiken om gegevens asynchroon te verzenden en ontvangen.

antwoordde op 17/08/2008 om 14:53
bron van user

stemmen
7

Toen ik die nodig zijn om een applicatie met een client-server model waar de klanten kunnen verlaten en wanneer ze maar willen schrijven, (ik neem aan dat is ook het geval voor uw toepassing als u mobiele apparaten te gebruiken) Ik zorgde ervoor dat de cliënten stuur een online bericht naar de server, wijst erop dat ze waren aangesloten en klaar om te doen wat ze moesten doen.

op dat moment de server kan berichten verzenden naar de client via de zelfde open verbinding.

Ook, maar ik weet niet of dat van toepassing is voor u, had ik een soort van hartslag de klanten naar de server, te laten weten dat het nog steeds online. Op die manier weet de server wanneer een cliënt met geweld werd losgekoppeld van het netwerk en het zou kunnen dat de klant terug als offline te markeren.

antwoordde op 04/08/2008 om 15:30
bron van user

stemmen
3

Check out ASIO . Het is een aanzicht compatibel C ++ bibliotheek voor asynchrone IO. Ik ben niet zeker of dit nuttig is voor de server (ik heb nooit geprobeerd om een standaard c ++ DLL naar ac # project te koppelen), maar voor de klant zou het nuttig zou zijn.

We gebruiken het met onze applicatie, en loste de meeste van onze IO concurrency problemen.

antwoordde op 11/08/2008 om 11:00
bron van user

stemmen
3

Ik ben niet duidelijk over de vraag of je wil de asynchrone stukken toe te voegen aan de server in C # of de cliënt in C ++.

Als je het over hebt om dit te doen in C ++, kunnen desktop Windows-platforms socket doen I / O asynchroon via de API's die gebruik maken overlapte I / O. Voor contactdozen, WSASend, WSARecv beide toestaan ​​asynchrone I / O (lees de documentatie over hun LPOVERLAPPED parameters, die u kunt vullen met gebeurtenissen die krijgen ingesteld wanneer de I / O is voltooid).

Ik weet niet of Windows Mobile platformen ondersteunen deze functies, dus je zou kunnen hebben om wat extra graven doen.

antwoordde op 05/08/2008 om 06:30
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more