2011-04-28 48 views
14

我剛碰到這個奇怪的事情,我看到應用程序是默認情況下它們使用SOCK_STREAM函數。爲什麼這樣?這SOCK_STREAM只是創建多個流?或者它是可用於創建TCP流的標準SOCK_STREAM函數?奇怪的東西 - SOCK_DGRAM和SOCK_STREAM?

我認爲海嘯是基於UDP的,但仍然有一些像TCP那樣的功能,例如, TCP公平性,友好性等。

請問有人可以解釋一下這個問題嗎?我完全不知道這個..我的腦海裏一直沒有去:(

回答

6

更新:我的答案似乎沒有更多的相關性,但原來的問題提到了UDT,這是一個面向連接的協議。UDP之上此處瞭解詳情:http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol


UDT似乎提供了API,它模仿經典的BSD套接字API,因此它可以作爲一個簡易替換,對於流和麪向數據報的應用程序檢查如。 sendmsgrecvmsg - 如果在使用SOCK_STREAM創建的套接字上使用,則會拋出異常,並且所有的流orien特德API也會爲使用SOCK_DGRAM創建的套接字引發異常。

SOCK_DGRAM的情況下,它執行一些額外的處理,但它不會簡單地在這種情況下透明地封裝UDP套接字 - 就我瞭解代碼後快速審查(我不熟悉UDT內部或協議規範)。閱讀technical papers可能會有很大幫助。

該庫始終將其底層「真實」套接字創建爲數據報一(check channel.cpp,CChannel::open)。

25

TCP幾乎總是使用SOCK_STREAM,UDP使用SOCK_DGRAM。

TCP/SOCK_STREAM是一個基於連接的協議。連接建立並且雙方進行對話,直到連接被一方終止或網絡錯誤終止。

UDP/SOCK_DGRAM是基於數據報的協議。您發送一個數據報並獲得一個回覆,然後連接終止。

  • 如果您發送多個數據包,TCP承諾按順序發送它們。 UDP不會,所以接收器需要檢查它們,如果訂單 很重要。

  • 如果TCP數據包丟失,發件人可以告訴。對於UDP不是這樣。

  • UDP數據報的大小有限制,從內存中我認爲它是512 字節。 TCP可以發送比這更大的腫塊。

  • TCP性能更穩健,可以進行更多檢查。 UDP是一種較輕的重量(較少的計算機和網絡壓力)。

選擇適合您想要如何與其他計算機交互的協議。

+0

我使用EMBOS的IP堆棧。我創建了SOCK_DGRAM類型的套接字。但是select函數只有在我第一次接收UDP數據包時纔會被調用....在這種情況下,是否有與插座類型有關的問題? – 2014-12-04 08:15:32

+0

@GinuJacob - 我對EMBOS一無所知。創建一個新問題並選擇標籤(例如「EMBOS」),以吸引具有合適技能的人員來幫助您。 – 2014-12-05 03:09:07

+1

UDP/SOCK_DGRAM是一個基於數據報的協議,涉及NO連接。您可以發送任意數量的數據報並接收任意數量的數據報。這是「不可靠的服務」。 – 2015-11-19 20:17:20