Почему UDT использует SOCK_STREAM, если он основан на UDP? - PullRequest
0 голосов
/ 20 января 2012

В приведенном ниже примере кода appserver.cpp распространяется с UDT

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

Почему UDT использует SOCK_STREAM, а не SOCK_DGRAM?

Ответы [ 2 ]

2 голосов
/ 11 января 2013

UDT - это протокол передачи данных на основе UDP, так что в целом это всего лишь UDP.проверьте UDT Manual link - там написано

UDT ориентирован на соединение, как для режима SOCK_STREAM, так и для режима SOCK_DGRAMconnect должен быть вызван, чтобы установить соединение UDT.

, поэтому, что бы мы ни использовали, мы все должны сделать вызов connect ().так какая разница?В SOCK_STREAM мы можем использовать API send () udt, в то время как в SOCK_DGRAM мы можем использовать только API sendmsg () udt.

проверьте руководство "Передача данных" и "Обмен сообщениями с частичной надежностью", я думаю, что это может помочь немного.

2 голосов
/ 20 января 2012

Это может быть совершенно нормальным.

Если бы я ничего не знал о 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, о чем все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...