2013-10-19 70 views
1

我正在創建某種位於服務器和客戶端之間的網關。 所謂的網關應該過濾客戶端發送的一些數據包,並轉發99%的數據包。套接字數據包轉發

這裏是我的問題:

  1. 客戶端打開一個新的套接字到網關,我打開一個套接字從網關服務器並將其存儲在進一步使用列表。但是,在一種情況下,所有的連接都來自同一個IP,因此在選擇將數據包轉發到服務器的套接字時,我的選擇有限。我怎樣才能區分打開的套接字?

  2. 從以前的情況,我期待着大約500客戶端發送數據包的每一秒。性能方面,我應該使用多線程模型,還是堅持使用單線程應用程序?

  3. 仍然是一個性能問題:我有C#和Python之間做出選擇。哪一個應該提供更好的性能?

回答

1

插槽地址是主機和端口,不只是一臺主機。而來自同一主機的不同連接將始終具有不同的端口。 (我假設TCP,UDP不是這裏。)

或者更簡單地說,你可以比較文件的描述符(或者,在Python,插座對象本身),而不是他們的同行地址。同時,對於性能,在大多數平臺上,500接近您可以對線程做的限制,但尚未超過限制,因此您可以使用這樣做。但我認爲用單線程反應器或具有小線程池的proactor會更好。特別是如果你可以使用像扭曲或gevents這樣的預先存在的框架來爲你做出難題。

至於語言,只是轉發和過濾數據包,您的插座復的表現將是重要的一切,所以有使用Python沒有問題。從任一種語言中挑選你喜歡的框架,並使用該語言。

一些最後端註釋:你知不知道TCP數據包不會在你的更高水平協議(S)信息匹配起來,對吧?而且,這整個事情可能會更容易做到,而且更高效,將Linux或BSD設置爲路由器,因此您不必寫任何內容而只使用過濾器。

+0

客戶端的身份驗證是通過它在服務器上的套接字描述符完成的,沒有更高級別的協議。 對於1%的數據包,我將不得不做一些數據庫檢查,並且我不希望流程中出現任何重大延遲。 –

+0

@your_average_programmer:怎麼會有沒有更高層次的協議?如果數據沒有任何意義,你使用套接字是什麼? – abarnert