2011-08-31 125 views
1

我需要編寫一種代理服務器,我的設計有點像這樣: 1.套接字服務器(使用Windows事件選擇模型)。程序有一個監聽器線程監聽網絡事件。
2.客戶列表(目前由socketid索引)。 3.套接字服務器接受一個新連接,然後爲每個客戶端創建一個新線程。新線程創建一個套接字連接來結束目標服務器(需要一個持久連接)。如何將消息傳遞給線程

我已經寫了套接字服務器,工作正常。我的問題是當新的消息從客戶端進入時,我如何將此消息傳遞到相關的線程(因此消息可以發送到目標服務器)。

在我的服務器中,我從客戶端消息中獲取最終目標服務器的地址。我可以從客戶端套接字列表中查找客戶端套接字。但是,我該如何將消息發送到正確的線程?

在我到目前爲止所使用的線程中,線程函數只是運行一個循環。我是否調用線程函數,將消息作爲參數傳遞給它?

任何人都有如何做到這一點好主意?

我可以不只是有一個客戶端套接字ID和目標服務器套接字ID的地圖。

接受客戶端套接字後,連接到目標服務器併發送消息。將目標服務器套接字標識保存到地圖中。

因此,當從客戶端獲取新的msg時,在映射中查找dest服務器並將消息發送到必需的服務器套接字。

其實,我是否需要使這個多線程?

+0

爲什麼要使用發送線程呢?只要有線程接收到客戶端的'消息',就可以直接使用傳出套接字。否則沒有乾淨的機制將上下文切換到特定的線程,而不使用每個線程的隊列。 –

回答

2

使用消息或同步原語,如隊列,郵箱,事件信號等

例如,如果每個線程有數據的隊列發送,您只需將寫入該隊列。隊列必須是線程安全的,以允許併發訪問。

0

本質上,您需要每個線程的消息隊列。然後,您可以將傳入數據發佈到該隊列中,並且該線程可以依次處理它。

有很多方法來實現這樣的隊列。例如,您可以使用Windows消息隊列,並將Windows消息發佈到目標線程擁有的窗口。或者,您可以使用自定義的線程安全消息隊列來傳遞數據,並使用由互斥鎖保護的數據結構。

0

我打算假設每個客戶都需要相同的處理。所以你需要的是一堆工作線程。獲得連接。拿起相關數據(互斥體)。處理。消除反應。

那麼爲什麼每個客戶端的線程。需要時構建工作線程。似乎更簡單的解決方案。