2013-04-10 35 views
3

我正在開發一個基本的婚介服務器。其基本過程是這樣的:發送和recv在不同的線程

  1. 客戶端連接到服務器,報表客戶的名字和比賽的,他們正在尋找
  2. 服務器報告回所有可能的匹配
  3. 客戶選擇符合他/她這類型願與
  4. 服務器配對相匹配的兩個客戶端

的問題是,每個客戶端連接的時間,我需要對所有可能的匹配報告這個新的客戶端,並報告所有可能匹配到新的連接客戶端(因此,無法匹配的客戶端必須始終準備好來自服務器的recv)。與此同時,客戶可以在任何時候選擇一個匹配,或者斷開(因此,客戶端必須隨時準備send和服務器必須準備recv

我懷疑真正解決這個問題使用線程,爲客戶端和服務器提供背景recv線程,以及與用戶交互的主線程send線程。

所以我有兩個問題與此:

  1. 是將它保存到sendrecv同時用同一個套接字連接上不同的線程?
  2. 這是甚至正確的方式來處理這個?

(標記爲C++和OBJ-C,因爲服務器是建立在C++和客戶端是OBJ-C)

+0

我知道你說這個項目並不特定於Objective-C,但是這些平臺提供了Grand Central Dispatch,它可以建立可擴展的asych。 I/O相對無痛。有一個小的學習曲線,但它適用於偵聽/ recv /發送,並且如果看起來有必要,您可以爲每個套接字創建新的隊列。 – dans3itz 2013-04-10 16:16:46

回答

2

是的,在一個線程上使用recv()而在使用相同套接字的另一個線程上使用send()是安全的。

如果您的客戶端同時連接到服務器的客戶端相對較少,則使用專用線程的服務器端將只能有效工作。如果可伸縮性是一個問題,則需要使用異步I/O或可能的話,使用I/O完成端口來管理單個線程上的多個客戶端,從而將所需線程的數量降至最低。

+0

定義「相對較少」?你的意思是10個左右,10個客戶,100個客戶?該服務器的可擴展性值得關注,但我並不認爲同時有大量客戶端同時連接到此服務器 – 2013-04-10 15:57:00

+0

除了少數幾百個客戶端之外,您應該考慮使用其他線程模型。 – 2013-04-10 17:06:20

+0

我不同意。這完全是您機器能力的問題。那裏有TCP服務器,通常可以處理數千甚至數萬個通過線程的連接。 – EJP 2013-04-10 22:41:21

1

這是在任何合理的socket庫實現安全。這也是正確的做法。