首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果UDP是基于UDP的,为什么UDT还要使用SOCK_STREAM?

如果UDP是基于UDP的,为什么UDT还要使用SOCK_STREAM?
EN

Stack Overflow用户
提问于 2012-01-20 12:42:34
回答 2查看 1.6K关注 0票数 0

在随UDT一起发布的示例代码appserver.cpp中发现了以下内容

代码语言:javascript
复制
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

为什么UDT要使用SOCK_STREAM而不是SOCK_DGRAM?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-20 18:54:05

这个可以是完全正常的。

如果我对UDT一无所知,那么我会假设"hints“很可能是addrinfo的一个实例,并且用作getaddrinfo()的第二个参数

如果代码只是试图获取服务器的IP地址(即DNS查找),那么它必须向socktype的提示结构传递一些内容。否则,getaddrinfo的结果很可能返回结果数的3倍。一个结果用于SOCK_STREAM,另一个用于SOCK_DGRAM,第三个用于SOCK_RAW。但是每一个的ai_addr成员都将是相同的地址。

现在,我只是在UDT代码中达到了一个峰值。直到现在才听说过。但它似乎有一些代码正在做一些SOCK_STREAM的事情,并使用getaddrinfo作为一种正式的方式来初始化sockaddr以便后续的TCP连接。

代码语言:javascript
复制
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开发人员它到底是怎么回事。

票数 2
EN

Stack Overflow用户

发布于 2013-01-11 17:09:45

UDT是基于UDP的数据传输协议,所以它就是UDP。查看UDT手册link。上面写着

对于

的SOCK_STREAM和SOCK_DGRAM模式,UDT都是面向连接的。必须调用connect才能设置UDT连接。

因此,无论我们使用什么,我们都必须执行connect()调用。那么有什么不同呢?在SOCK_STREAM中,我们可以使用udt的send() API,而在SOCK_DGRAM中,我们只能使用udt的sendmsg() API。

查看手册中的“传输数据”和“使用部分可靠性进行消息传递”,我认为它可能会有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8936822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档