在随UDT一起发布的示例代码appserver.cpp中发现了以下内容
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;为什么UDT要使用SOCK_STREAM而不是SOCK_DGRAM?
发布于 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连接。
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开发人员它到底是怎么回事。
发布于 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。
查看手册中的“传输数据”和“使用部分可靠性进行消息传递”,我认为它可能会有所帮助。
https://stackoverflow.com/questions/8936822
复制相似问题