在随UDT分发的示例代码appserver.cpp
中找到以下内容
hints.ai_flags = AI_PASSIVE;
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
为什么UDT会使用SOCK_STREAM而不是SOCK_DGRAM?
答案 0 :(得分:2)
可以 完全正常。
如果我对UDT一无所知,那么我会假设“提示”可能是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开发人员询问它的全部内容。
答案 1 :(得分:2)
UDT是基于UDP的数据传输协议,所以它只是UDP。 检查UDT手册 link。它说
对于SOCK_STREAM和SOCK_DGRAM模式,UDT都是面向连接的。必须调用connect才能建立UDT连接。
所以无论我们使用什么,我们都必须进行connect()调用。那有什么区别? 在SOCK_STREAM中,我们可以使用udt的send()API,而在SOCK_DGRAM中,我们只能使用udt的sendmsg()API。
检查手册的“传输数据”和“部分可靠性消息”,我认为这可能会有所帮助。