2011-02-03 102 views
2

我必須開發一個軟件發送相同的數據包到多個目的地。 但我不能使用多播方案。 (因爲我的老闆是一個愚蠢的男人) 所以,任何方式,問題是: 我有相同的數據包和多個IP地址(客戶端),我不能使用多播 我怎麼能以最好的方式做到這一點? 我必須使用C++作爲一種語言和Linux作爲平臺。 所以請幫我發送相同的數據包到多個客戶端

感謝名單

+6

我不知道你的老闆是不是一個愚蠢的人,但是......他是你的老闆,這是一個公共場所。我不確定侮辱他會帶來什麼問題。他可能有拒絕使用組播的理由。 – ereOn 2011-02-03 08:59:31

回答

0

如果你的老闆說你不能使用多播,也許他/她有他/她的理由。我猜廣播也不在遊戲中?

如果這些是必備條件,那麼您唯一的機會就是與要發送數據包的每個遠程主機建立TCP連接。

編輯
UDP,反之,將不提供對多播多少好處,如果你的應用程序將運行在一個LAN你是在收費的配置,這就是我指定的TCP的原因。

也許你必須更好地描述你的方案。

+0

我強烈反對你的聲明「UDP不會提供任何多播優點」:實際上,大多數路由器阻止IPv4多播幀,而UDP數據包不阻止。 – ereOn 2011-02-03 09:02:57

0

您必須在運行於特定端口的服務器上創建TCP Listerner,以監聽傳入的Tcp Client連接(套接字)。

每次客戶端連接時,您都必須將其緩存在某種類型的數據結構中,例如名稱值對(名稱是客戶端的唯一名稱,該值是該客戶端的網絡流,作爲TCP套接字)。

然後,當您終於準備好傳輸數據時,您可以遍歷這個名稱值對連接的集合,並將數據作爲字節數組逐個發送到每個客戶端或從每個連接的客戶端的一個線程產生一個線程,同時發送數據。

TCP是一個龐大的協議(由於其面向連接的性質)和大量數據(如視頻/圖像)的傳輸可能非常緩慢。

UDP絕對是流式傳輸大數據包的選擇,但您必須與交付保證進行權衡。

0

這可以用TCP或UDP完成,具體取決於您的可靠性要求。你能容忍丟失或重新排序的數據包嗎?你準備好處理超時和重傳嗎?如果兩個答案都是「是」,請選擇UDP。否則留在TCP。然後:

  • TCP案例。而不是單個多播UDP套接字,你將有多個TCP套接字,每個目的地一個。你將不得不弄清楚連接建立的最佳方案。定期聆聽和接受連接客戶的工作如常。然後,您只需遍歷連接的套接字並將數據發送給每個套接字。
  • UDP情況。這可以通過服務器端的單個UDP套接字完成。如果您知道客戶端(數據接收器)的IP和端口,則對每個地址/端口使用相同的數據使用sendto(2)。當時客戶必須是recv(2)。如果你不知道你的客戶,你需要爲客戶設計一個請求的數據,或只是註冊與服務器。這就是recvfrom(2)是有用的 - 它給你的客戶端的地址。
0

您已經通過對多播說「no」來限制自己。我猜想將數據包發送到多個客戶端只是您的要求的一部分,除非您投入更多的燈光,否則很難提供完整的解決方案。

您是否期待客戶端與服務器之間的雙向通信?在這種情況下,選擇多播可能證明是複雜的。請澄清

您必須遍歷客戶端並逐個發送數據包。如果您希望客戶迴應,您可能需要堅持這些會話。

UDP或TCP的選擇依賴於發送數據的性質。使用UDP,您需要處理不按順序的數據包,並且還需要執行重新傳輸。

相關問題