2016-11-21 110 views
1

我已經創建了一個簡單的服務器,當前使用TCP套接字滿足我所有的打包需求。如果一些數據傳輸最好與TCP和其他UDP協議一起使用,那麼串聯使用它們的最有效方法是什麼?你能擁有2個插座嗎?我找不到示例代碼來顯示最佳實踐,如果做得不正確,它似乎很難調試。謝謝!同時使用TCP和UDP套接字

回答

2

沒有什麼可以阻止你擁有2個偵聽套接字,每個套接字對於TCP和UDP都是一個套接字。但是,對於給定的應用,通常預先選擇通信方法。例如,syslog協議幾乎總是隻用UDP來實現。另一方面,HTTP幾乎總是隻通過TCP實現。有幾種協議經常支持這兩種協議(NTP,DNS是例子)。

找到一個允許單個邏輯數據流同時使用的單個應用程序是非常罕見的,並且幾乎不可能獲得可靠的工作。

但是,除此之外,如果您確實支持這兩種機制,調試很簡單,因爲每個都可以獨立處理和調試。

如果您需要可靠的順序交付,TCP更容易使用 - 對於大多數應用來說,這是明顯的選擇。通過TCP發送的每個字節都保證按照您發送的順序發送(或者您將收到明確的錯誤通知),並且兩臺機器之間的對等操作系統將根據需要合作嘗試重試,以防發生任何數據包丟失路線。很多東西你不必擔心在這裏。缺點是:(a)一些增加的開銷,和(b)「消息」邊界不被遵守(即,TCP提供一串字節;接收方不一定會使它們處於它們發送的相同離散塊所以你必須自己強加消息邊界)。

UDP不保證傳送。也就是說,數據包可能仍然被丟棄,但是沒有通知發件人,您的(即您的應用程序的)責任恰當地處理。同樣,數據包有可能以不同的順序顯示(例如由於不同的路由路徑)。另一方面,您發送的數據包是您收到的數據包,因此您的消息邊界保持不變。

所以UDP通常用於簡短的「一次性」或單個消息通知,在應用程序級別很容易設置超時,或者每個消息獨立並且丟失消息不重要。當連接長時間連接或需要發送大量連續數據流(文件傳輸等)時,TCP通常是更好的選擇。

1

除非您使用原始套接字,否則您必須有兩個單獨的套接字用於UDP和TCP通信。

  • TCP和UDP是獨立的OSI 4級協議。
  • 如果您使用具有默認選項的套接字,則很可能是TCP套接字。
  • 指定創建套接字時要使用的協議 - SOCK_STREAM用於TCP,SOCK_DGRAM用於UDP。
  • C#可能有更多可讀選項,而不是SOCK_STREAMSOCK_DGRAM
  • 如果您確實使用原始套接字,則可以通過解析IP標頭來區分協議。