發現在示例代碼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不?
發現在示例代碼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不?
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開發人員詢問它的全部內容。
欣賞你的時間和精力在仰視UDT。 +1。我認爲你的解釋是有道理的,直到有人提出一個更確定的答案。再次感謝 –
您需要哪些附加信息才能獲得「更多確認答案」? – selbie
不要低估你以任何方式,但我有一個印象,你做的UDT庫的目視檢查,並在代碼中實際上並沒有使用它,或因此纔出現。所以我們不能排除不需要的副作用。我自己也沒有太多的機會玩UDT。 –
UDT是基於UDP的數據傳輸protocal,所以在它所有的只是UDP。 檢查UDT手冊 link。它說
UDT是面向連接的,對於它的SOCK_STREAM SOCK_DGRAM和模式。必須調用連接才能建立UDT連接。
因此,無論我們使用什麼,我們都必須執行connect()調用。所以有什麼區別? 在SOCK_STREAM,我們可以使用UDT的send()API,而在SOCK_DGRAM,我們只能使用UDT的SENDMSG()API。
檢查手冊的「傳輸數據」和「信息與部分可靠性」,我認爲這可能是做一個小的幫助。
我不知道UDT協議 - 但如果它說,它使用UDP和使用SOCK_STREAM - 那麼我同意你的看法 –