2008-08-04 47 views
20

我有一個客戶端 - 服務器應用程序,客戶端位於Windows Mobile 6設備上,用C++編寫,服務器位於完整Windows上,並用C#編寫。通過相同的開放套接字進行異步多方向服務器 - 客戶端通信?

最初,我只需要它將消息從客戶端發送到服務器,而服務器只發送一個確認它收到消息。現在,我想更新它,以便服務器可以實際向客戶端發送消息以請求數據。正如我目前所設置的,客戶端在將數據發送到服務器後才處於接收模式,這不允許服務器隨時發送請求。我將不得不等待客戶數據。我的第一個想法是在客戶端創建另一個線程,使用單獨的開放套接字,監聽服務器請求......就像服務器已經在客戶端方面一樣。在同一個線程中並且使用相同的套接字,有沒有辦法在任何時候向所有服務器發送請求?

你能用WaitForMultipleObjects()的影響,並傳遞一個接收緩衝區和一個事件,告訴它有數據要發送?

回答

7

當我需要編寫一個客戶端 - 服務器模型的應用程序時,客戶端可以隨時離開並輸入它(我假設您的應用程序在使用移動設備時也是如此),我確信客戶端發送在線消息到服務器,表明他們已連接並準備好做他們需要做的任何事情。

此時服務器可以通過相同的開放連接將消息發送回客戶端。

此外,但我不知道是否適用於您,我有某種心跳客戶端發送到服務器,讓它知道它仍然在線。這樣服務器就知道客戶端何時被強行從網絡斷開,並且可以將該客戶端標記爲離線。

3

我不清楚你是否想將異步位添加到C#中的服務器或C++中的客戶端。

如果你正在討論在C++中這樣做,桌面Windows平臺可以通過使用重疊I/O的API異步執行套接字I/O。對於套接字,WSASend和WSARecv都允許異步I/O(請閱讀LPOVERLAPPED參數的文檔,您可以使用在I/O完成時設置的事件來填充這些參數)。

我不知道Windows Mobile平臺是否支持這些功能,因此您可能需要進行一些額外的挖掘。

3

結帳asio。它是異步IO的交叉兼容的C++庫。我不確定這對服務器是否有用(我從來沒有嘗試將標準C++ DLL鏈接到c#項目),但對於客戶端來說它會很有用。

我們將它與我們的應用程序一起使用,它解決了我們大部分的IO併發問題。

7

單線程完全可以使用異步通信!

網絡軟件開發中有一種常見的設計模式,稱爲反應堆模式(look at this book)。一些衆所周知的網絡庫提供了這種模式的實現(look at ACE)。

簡而言之,反應堆是一個物體,你將所有的套筒註冊到裏面,然後等待一些東西。如果發生了什麼事情(新數據到達,連接關閉......)反應堆將通知您。當然,您只能使用一個套接字來異步發送和接收數據。