2012-01-20 48 views
0

發現在示例代碼appserver.cpp下面用UDT爲什麼UDT使用SOCK_STREAM(如果它基於UDP)?

分佈
hints.ai_flags = AI_PASSIVE; 
hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 

爲什麼會UDT使用SOCK_STREAM和SOCK_DGRAM不?

+0

我不知道UDT協議 - 但如果它說,它使用UDP和使用SOCK_STREAM - 那麼我同意你的看法 –

回答

2

This can是完全正常的。

如果我不知道什麼UDT,那麼我會認爲「暗示」很可能addrinfo中的實例,並用作getaddrinfo()

第二個參數如果代碼只是想獲得的IP服務器的地址(即DNS查找),那麼它必須將某些東西傳遞給socktype的提示結構。否則,getaddrinfo的結果可能會返回結果數量的3倍。一個是SOCK_STREAM,另一個是SOCK_DGRAM,另一個是SOCK_RAW。但每個ai_addr成員將是相同的地址。

現在我只取一峯在UDT代碼。直到現在還沒有聽說過它。但它似乎有一些代碼正在做一些SOCK_STREAM的東西,並使用getaddrinfo作爲初始化後續TCP連接的sockaddr的正式方式。

memset(&hints, 0, sizeof(struct addrinfo)); 
hints.ai_flags = AI_PASSIVE; 
hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 

UDTSOCKET fhandle = UDT::socket(hints.ai_family, hints.ai_socktype,hints.ai_protocol); 

if (0 != getaddrinfo(argv[1], argv[2], &hints, &peer)) 
{ 
    cout << "incorrect server/peer address. " << argv[1] << ":" << argv[2] << endl; 
    return -1; 
} 

// connect to the server, implict bind 
if (UDT::ERROR == UDT::connect(fhandle, peer->ai_addr, peer->ai_addrlen)) 

但是,您必須向UDT開發人員詢問它的全部內容。

+0

欣賞你的時間和精力在仰視UDT。 +1。我認爲你的解釋是有道理的,直到有人提出一個更確定的答案。再次感謝 –

+0

您需要哪些附加信息才能獲得「更多確認答案」? – selbie

+0

不要低估你以任何方式,但我有一個印象,你做的UDT庫的目視檢查,並在代碼中實際上並沒有使用它,或因此纔出現。所以我們不能排除不需要的副作用。我自己也沒有太多的機會玩UDT。 –

2

UDT是基於UDP的數據傳輸protocal,所以在它所有的只是UDP。 檢查UDT手冊 link。它說

UDT是面向連接的,對於它的SOCK_STREAM SOCK_DGRAM和模式。必須調用連接才能建立UDT連接。

因此,無論我們使用什麼,我們都必須執行connect()調用。所以有什麼區別? 在SOCK_STREAM,我們可以使用UDT的send()API,而在SOCK_DGRAM,我們只能使用UDT的SENDMSG()API。

檢查手冊的「傳輸數據」和「信息與部分可靠性」,我認爲這可能是做一個小的幫助。

相關問題