Asynkron multi-retning tjener-klient kommunikasjon over det samme åpne kontakten?

stemmer
20

Jeg har en klient-server-app hvor klienten er på en Windows Mobile 6-enheten, skrevet i C ++ og serveren er på full Windows og skrevet i C #.

Opprinnelig trengte jeg bare det å sende meldinger fra klienten til serveren, med serveren bare noen gang å sende tilbake en bekreftelse på at de har mottatt meldingen. Nå ønsker jeg å oppdatere den slik at serveren kan faktisk sende en melding til kunden å be om data. Som jeg for tiden har det satt opp slik at kunden er bare i mottaksmodus etter at den sender data til serveren, dette ikke tillater for serveren å sende en forespørsel til enhver tid. Jeg måtte vente på klientdata. Min første tanke ville være å skape en annen tråd på klienten med en egen åpen socket, lytter etter forespørsler ... akkurat som serveren allerede har i forhold til klienten. Er det en måte, i samme tråd og bruker samme socket, til alle server for å sende forespørsler til enhver tid?

Kan du bruke noe til påvirke av WaitForMultipleObjects()og gi det en mottaksbuffer og en hendelse som forteller det er det data som skal sendes?

Publisert på 04/08/2008 klokken 13:52
kilden bruker
På andre språk...                            


4 svar

stemmer
7

Ved hjelp av asynkron kommunikasjon er helt mulig i enkelt tråd!

Det er et felles design mønster i nettverksprogramvaren utvikling kalt reaktoren mønster ( titt på denne boken ). Noen kjente nettverket biblioteket gir en implementering av dette mønsteret ( se på ACE ).

Kort fortalt er reaktoren et objekt, registrer deg alle dine stikkontakter inne, og du venter på noe. Hvis noe skjedde (nye data kom, tilkobling nær ...) reaktoren vil varsle deg. Og selvfølgelig kan du bruke bare én kontakt for å sende og mottatt data asynkront.

Svarte 17/08/2008 kl. 13:53
kilden bruker

stemmer
7

Når jeg trengte å skrive en søknad med en klient-tjener der kundene kunne forlate og gå inn når de vil, (jeg antar det er også tilfelle for din søknad som du bruker mobile enheter) Jeg sørget for at kundene send en online melding til serveren, noe som indikerer at de var koblet og klar til å gjøre hva de trengte å gjøre.

på den tiden serveren kunne sende meldinger tilbake til klienten gjennom samme åpne tilkoblingen.

Også, men jeg vet ikke om det er aktuelt for deg, hadde jeg en slags hjerterytme kundene sendes til serveren, slik at det vet det var fortsatt online. På den måten vet serveren når en klient ble tvangs koblet fra nettverket, og det kan markere at klienten tilbake som offline.

Svarte 04/08/2008 kl. 14:30
kilden bruker

stemmer
3

Sjekk ut ASIO . Det er en krysning kompatibel c ++ bibliotek for asynkron IO. Jeg er ikke sikker på om dette ville være nyttig for serveren (jeg har aldri prøvd å koble en standard c ++ DLL til ac # prosjekt), men for kunden det ville være nyttig.

Vi bruker det med vår søknad, og det løste de fleste av våre IO samtidighet problemer.

Svarte 11/08/2008 kl. 10:00
kilden bruker

stemmer
3

Jeg er ikke klart om hvorvidt du ønsker å legge til asynkrone biter til serveren i C # eller klienten i C ++.

Hvis du snakker om å gjøre dette i C ++, kan stasjonære Windows-plattformer gjør socket I / O asynkront gjennom API-er som bruker overlappes I / O. For stikkontakter, WSASend, WSARecv både tillate asynkron I / O (les dokumentasjonen på sine LPOVERLAPPED parametere, som du kan fylle med hendelser som blir stilt når I / O er ferdig).

Jeg vet ikke om Windows Mobile plattformer støtter disse funksjonene, slik at du kan ha å gjøre litt ekstra graving.

Svarte 05/08/2008 kl. 05:30
kilden bruker

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