Vă mulțumim pentru susținere

Asynchronous multi-direction server-client de comunicare pe același socket deschis?

Am o aplicație client-server unde clientul se află pe un dispozitiv Windows Mobile 6, scris în C și serverul este pe Windows complet și scris în C #.

Inițial, am avut nevoie doar de trimiterea mesajelor de la client către server, iar serverul trimitea vreodată o confirmare că a primit mesajul. Acum, aș dori să o actualizăm astfel încât serverul să poată trimite de fapt un mesaj clientului pentru a solicita date. Așa cum am setat în prezent, astfel încât clientul este numai în modul de primire după ce trimite date către server, acest lucru nu permite serverului să trimită o solicitare în orice moment. Ar trebui să aștept datele despre clienți. Primul meu gând ar fi să creez un alt fir pe client cu un soclu deschis separat, ascultând pentru cereri de server ... la fel ca serverul are deja în privința clientului. Există o modalitate, în cadrul aceluiași fir și utilizând același socket, pentru ca întregul server să trimită cereri în orice moment?

Puteți folosi ceva pentru a influența WaitForMultipleObjects () și să îi transmiteți un tampon de primire și un eveniment care spune că există date care trebuie trimise?

0
adăugat editat

4 răspunsuri

Nu sunt clar dacă doriți sau nu să adăugați biți asincrone la serverul din C # sau clientul în C ++.

Dacă vorbești despre acest lucru în C ++, platformele Windows desktop pot face asincron socket I / O prin API-urile care utilizează I / O suprapuse. Pentru prize, WSASend, WSARecv permit atât asincronizarea I / O (citiți documentația privind parametrii LPOVERLAPPED, pe care o puteți popula cu evenimentele care se stabilesc când I / O se termină).

Nu știu dacă platformele Windows Mobile acceptă aceste funcții, deci este posibil să trebuiască să faceți unele sapaturi suplimentare.

0
adăugat

Consultați ASIO . Aceasta este o cruce compatable C ++ bibliotecă pentru IO asincron. Nu sunt sigur dacă acest lucru ar fi util pentru server (nu am mai încercat să conecteze un standard C ++ DLL la un proiect # c), dar pentru client ar fi util.

Îl folosim cu aplicația noastră și am rezolvat majoritatea problemelor legate de concursul IO.

0
adăugat

Când am avut nevoie să scriu o aplicație cu un model client-server în cazul în care clienții ar putea părăsi și intra ori de câte ori doresc (presupun că este cazul și pentru aplicația dvs. pe măsură ce folosiți dispozitive mobile), am asigurat că clienții trimit > on-line către server, indicând faptul că au fost conectați și gata să facă tot ceea ce aveau nevoie.

în acel moment serverul ar putea trimite mesaje înapoi către client prin aceeași conexiune deschisă.

De asemenea, dar nu știu dacă acest lucru este valabil pentru dvs., am avut un fel de inimă pe care clienții l-au trimis pe server, lăsându-l să știe că era încă online. În acest fel, serverul știe când un client a fost deconectat forțat de la rețea și putea marca acel client ca offline.

0
adăugat

Utilizarea comunicației asincrone este posibilă în totalitate într-un singur fir!

There is a common design pattern in network software development called the reactor pattern (look at this book). Some well known network library provides an implementation of this pattern (look at ACE).

Pe scurt, reactorul este un obiect, vă înregistrați toate prizele înăuntru și așteptați ceva. Dacă sa întâmplat ceva (au apărut date noi, conexiunea este aproape ...), reactorul vă va anunța. Și, desigur, puteți utiliza doar un singur soclu pentru a trimite și a primi date asincron.

0
adăugat