如果UDT基于UDP,为什么使用SOCK_STREAM?

时间:2012-01-20 04:42:34

标签: sockets udp

在随UDT分发的示例代码appserver.cpp中找到以下内容

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

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

2 个答案:

答案 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。

检查手册的“传输数据”和“部分可靠性消息”,我认为这可能会有所帮助。