Asynchroniczna multi-kierunek komunikacja serwer-klient nad samym gniazda otwartego?

głosy
20

Mam aplikacji klient-serwer, gdzie klient jest na urządzenia Windows Mobile 6, napisany w języku C ++ i serwer jest na pełnym Windows i napisany w języku C #.

Pierwotnie, ja tylko potrzebny do wysyłania wiadomości od klienta do serwera, a serwer tylko kiedykolwiek odesłanie potwierdzenia, że ​​otrzymał wiadomość. Teraz chciałbym go zaktualizować tak, że serwer rzeczywiście może wysłać wiadomość do klienta na dane zapytanie. Jak obecnie mam go skonfigurować tak, klient jest tylko w trybie odbioru po wysyła dane do serwera, to nie pozwala na serwerze, aby wysłać żądanie w dowolnym momencie. musiałbym czekać do danych klientów. Moją pierwszą myślą byłoby stworzenie innego wątku na kliencie z oddzielnym gniazdem otwartym, nasłuchiwanie żądań serwera ... podobnie jak serwer ma już w stosunku do klienta. Czy istnieje sposób, w tym samym wątku i przy użyciu tego samego gniazda, do wszystkich serwera do wysyłania żądania w dowolnym momencie?

Można użyć coś do wpływają na WaitForMultipleObjects()i przekazać to bufor odbiorczy i zdarzenia, który informuje go nie ma danych do wysłania?

Utwórz 04/08/2008 o 14:52
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
7

Korzystanie asynchronicznej komunikacji jest całkowicie możliwe w pojedynczej nici!

Istnieje wspólny wzorzec projektowania w rozwoju oprogramowania sieciowego zwany wzór reaktor ( spojrzenie w tej książce ). Niektóre dobrze znane biblioteki sieć zapewnia realizację tego wzorca ( patrzeć na ACE ).

Pokrótce, reaktor jest obiektem, zarejestrować wszystkie swoje gniazda wewnątrz i czekać na coś. Jeśli coś się stało (nowe dane przybył, ścisły związek ...) reaktor poinformuje Cię. I oczywiście, można użyć tylko jednego gniazda do wysyłania i odebranych danych w sposób asynchroniczny.

Odpowiedział 17/08/2008 o 14:53
źródło użytkownik

głosy
7

Kiedy potrzebowałem napisać aplikację z klient-serwer, gdzie klienci mogą pozostawić i wejść kiedy chcą, (zakładam, że także w przypadku aplikacji, jak korzystać z urządzeń mobilnych) Zrobiłem pewien, że klienci wysłać internetowego wiadomość do serwera, wskazując były podłączone i gotowe zrobić wszystko musieli robić.

w tym czasie serwer może wysyłać wiadomości do klienta tego samego koryta otwartego połączenia.

Również, ale nie wiem, czy to dotyczy Ciebie, miałem jakieś bicie serca klientów wysłane na serwer, pozwalając, by wiedzieć, że to nadal w Internecie. W ten sposób serwer wie, kiedy klient został przymusowo odłączona od sieci, a to może oznaczać, że klient z powrotem jako offline.

Odpowiedział 04/08/2008 o 15:30
źródło użytkownik

głosy
3

Sprawdź ASIO . Jest to krzyż kompatybilne c ++ biblioteki Asyncronous IO. Nie jestem pewien, czy to byłoby użyteczne dla serwera (nigdy nie próbowałem połączyć standardowy c ++ DLL do AC # projektu), ale dla klienta byłoby użyteczne.

Używamy go z naszej aplikacji, a to rozwiązać większość naszych problemów współbieżności IO.

Odpowiedział 11/08/2008 o 11:00
źródło użytkownik

głosy
3

Nie jestem jasne, czy nie jesteś chcąc dodać asynchronicznych bity do serwera w C # lub klienta w C ++.

Jeśli mówisz w ten sposób w C ++, Desktop platformy Windows mogą zrobić gniazdo I / O asynchronicznie za pośrednictwem interfejsu API w tym wykorzystania pokrywały I / O. Dla gniazd WSASend, WSARecv zarówno umożliwić asynchroniczne I / O (przeczytaj dokumentację na ich parametry LPOVERLAPPED, które można zainstalować z wydarzeń, które gotowi, gdy I / O zakończeniu).

Nie wiem, czy platformy Windows Mobile obsługuje tych funkcji, więc może trzeba zrobić kilka dodatkowych kopania.

Odpowiedział 05/08/2008 o 06:30
źródło użytkownik

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