Asynchronní multi-směru server-klient komunikace přes stejné otevřené zásuvky?

hlasů
20

Mám klient-server aplikací, kde je klient na 6 zařízení se systémem Windows Mobile, napsaný v C ++ a server je v plné Windows a napsaný v jazyce C #.

Původně jsem potřeboval ji pouze k odesílání zpráv z klienta na server, přičemž server jen někdy posílá zpět potvrzení, že zprávu obdržel. Nyní bych chtěl aktualizovat tak, že server může ve skutečnosti poslat zprávu klientovi požadovat údaje. Jak jsem v současné době je nastaveno tak, že klient je pouze v režimu přijímání poté odešle data na server, to neumožňuje pro server odeslat požadavek kdykoliv. Budu muset počkat na údaje o klientovi. Moje první myšlenka by bylo vytvořit další vlákno na straně klienta se samostatnou zásuvkou s otevřeným, přijímat žádosti serverů ... stejně jako server má již s ohledem na klienta. Existuje způsob, jak v rámci stejné nitě a za použití stejného zásuvku, do celého serveru k odesílání požadavků kdykoliv?

Můžete použít něco, jaký vliv of WaitForMultipleObjects()a předat ho přijímací vyrovnávací paměť a událost, která ji říká, že jsou data k odeslání?

Položena 04/08/2008 v 14:52
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
7

Použijete-li asynchronní komunikace je zcela možné v jednom vlákně!

K dispozici je společná návrhový vzor v rozvoji sítě software nazvaný vzor reaktor ( Podívejte se na této knize ). Někteří dobře známé knihovní sítě poskytuje implementaci tohoto vzoru ( podívejte se na ACE ).

Stručně řečeno, reaktor je objekt, můžete zaregistrovat všechny své zásuvek uvnitř, a čekat na něco. Kdyby se něco stalo (nová data dorazila, připojení blízko ...) reaktor vás upozorní. A samozřejmě, můžete použít pouze jednu zásuvku pro odesílání a přijatých dat asynchronně.

Odpovězeno 17/08/2008 v 14:53
zdroj uživatelem

hlasů
7

Když jsem potřeboval napsat aplikaci, s modelu klient-server, kde by klienti opustit a vstoupit kdykoliv chtějí, (předpokládám, že je to i v případě vaší žádosti budete používat mobilní zařízení), jsem si jistý, že klienti odeslat on-line zprávu na serveru, což znamená, že byly spojeny a je připraven udělat cokoliv, co potřebovali dělat.

V té době mohl server odesílat zprávy zpět klientovi koryto stejné navázáno spojení.

Také, ale nevím, jestli to platí pro vás, měl jsem nějakou srdeční tep klienti poslal na server, nechat to, že to byl stále on-line. Tak server ví, kdy byl klient nuceně odpojen od sítě, a to může označit, že klient zpět jako offline.

Odpovězeno 04/08/2008 v 15:30
zdroj uživatelem

hlasů
3

Podívejte se na asio . To je kříž kompatibilní C ++ knihovna pro asyncronous IO. Nejsem si jistý, jestli by to bylo užitečné pro server (nikdy jsem se snažil propojit standardní C ++ DLL do AC # projekt), ale pro klienta, že by bylo užitečné.

Používáme ji s naší aplikaci, a většina našich problémů IO souběžnosti je vyřešen.

Odpovězeno 11/08/2008 v 11:00
zdroj uživatelem

hlasů
3

Nejsem jasné, o tom, zda budete chtít přidat asynchronní bitů na server v C # nebo klienta v jazyce C ++.

Pokud mluvíte o tom to v jazyce C ++, může desktop platformy Windows dělat zásuvku I / O asynchronně prostřednictvím rozhraní API je toto použití překryty I / O. Pro zásuvky, WSASend, WSARecv oba umožňují asynchronní I / O (přečtěte si dokumentaci na svých LPOVERLAPPED parametrů, které můžete naplnit s událostmi, které se dostanou nastavit, kdy I / O dokončení).

Já nevím, jestli Windows Mobile platformy podporují tyto funkce, takže možná budete muset udělat nějaké další kopání.

Odpovězeno 05/08/2008 v 06:30
zdroj uživatelem

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