2013-04-12 51 views
5

我正在編寫UDP服務器/客戶端應用程序。將40個套接字綁定到40個不同的IP地址

我希望我的單個服務器一次處理40個客戶端。爲此,我想創建40個專用線程,每個專用於一個客戶端。由於每個客戶端有40個線程,我想創建40個專用套接字。

但這個問題:

我不知道會是什麼40的IP地址,而我具約束力,()我的插座。 (因爲就我而言,我必須綁定()到我的服務器的IP地址。)通常我綁定()到"INADDR_ANY"時,只有一個套接字。

但是,我應該綁定()我的每個40插座的IP地址應該是什麼? 請幫幫我。任何評論/幫助表示讚賞。

+0

你需要40個套接字(套接字地址)還是40個IP地址?你的主人會有這麼多? –

回答

2

的常用方法是:

  • 服務器bind()的一個衆所周知的端口。
  • 客戶端將初始數據包發送到該已知端口
  • 服務器從衆所周知的端口上的客戶端接收第一個數據包。
  • 服務器使用隨機端口創建一個新套接字
  • 服務器從此新套接字向客戶端進行回覆。
  • 客戶端收到回覆,發現它來自另一個端口,而不是衆所周知的 服務器端口,並將該端口用作進一步通信的目的地。

您將使用getpeername()調用來了解遠程地址。

請記住,UDP是無連接的,您需要某種方式來告知您的套接字結束或超時。

1

通常的方法是bind單個socket和​​傳入連接。通過接受每個連接將被分配一個唯一的套接字。

當您使用UDP時,我會簡單地使用上述TCP來讓客戶端知道它們各自的服務器UDP地址。

+1

accept()用於tcp,而我正在使用UDP。 – Ayse

+0

它是我的系統創建40個套接字的要求。現在的問題是,我不知道什麼IP地址必須綁定()到這40個套接字:( – Ayse

+0

@Ayesha Hassen:我增加了我的答案,以解決UDP。 –

2

bind只需要本地地址,而不是遠程地址。

如果你想爲每個客戶端使用一個套接字,那麼你需要使用不同的端口(使用bind)。這樣,每個客戶端都可以將其流量發送到專用端口,並且每個套接字/端口都可以有一個線程。

雖然只有一個套接字(和一個端口),但在您的代碼中有邏輯可以根據遠程地址爲線程分配流量(例如,使用recvfrom進行檢索)。與UDP做到這一點

+0

如果只有一個線程和所有的40個客戶端在這個單一套接字上同時發送數據,有可能每個客戶端的數據丟失 由於這個原因,我轉向爲每個客戶端創建專用套接字 – Ayse

+1

如果你真的想要專用套接字,我解釋瞭如何我不明白你爲什麼認爲數據會丟失,如果你只使用一個套接字 –

+0

謝謝你的幫助:)真的幫助我:) 我想知道的一件事是,什麼是如果我創建40個線程/套接字而不是一個監聽線程,則會帶來不便。每個人似乎都反對這個想法。背後有一些堅實的原因嗎?爲什麼不應該爲每個客戶端創建40個專用的線程/套接字,而應該專注於創建一個套接字? :( – Ayse

1

在專用的偵聽線程中創建單個偵聽套接字。

當它收到一個新的數據包時,使用數據包的遠程地址/端口,或在數據包有效載荷中放入一個唯一的clientID來唯一標識客戶端。

爲該客戶端創建一個新線程(如果尚不存在),將數據包傳遞給該線程以進行進一步處理,然後返回偵聽。

如果給定的客戶端線程暫時沒有收到任何數據包,它可以自行終止。

相關問題