2016-09-13 2 views
0

Я иду через MSDN в «Getting Started With Winsock» и они открывают сокет с параметрамиC++ - Что ptr-> ai_family сделать против AF_INET

struct addrinfo *result = NULL, 
       *ptr = NULL, 
       hints; 

iResult = getaddrinfo(
     argv[1], 
     DEFAULT_PORT, 
     &hints, 
     &result 
); 

ptr=result; 

ConnectSocket = socket(
     ptr->ai_family,     // Address Family (address families like ipv6 ipv4) 
     ptr->ai_socktype,    // Type (Like tcp, udp ect) 
     ptr->ai_protocol    // Protocol to use (0 = service provider chooses) 
    ); 

Но binarytides «Winsock tutorial» делает это так (они используют C, но я видел, как люди это делают в C++)

s = socket(
    AF_INET , 
    SOCK_STREAM , 
    0 
) 

Что делает ptr-> делать? и зачем использовать его, просто устанавливая его как AF_INET?

Кроме того, если у вас есть свободное время и хорошо знаете розетки, я был бы признателен за помощь.

+0

Вы не показали, что «ptr» так сложно сказать. –

+0

@SamiKuhmonen aahhh да, только что отредактирован. –

ответ

2
socket(ptr->ai_family,ptr->ai_socktype, ptr->ai_protocol); 

передает переменные, чтобы создать сокет вместо жесткого кодирования значений. Преимущество, которое вы получаете, это то, что код работает как для IPv4, так и для IPv6.

ptr->ai_family - это целое число, являющееся членом struct addrinfo. (И если вы хотите знать о конкретном синтаксисе ptr->, вы можете пройти через this question), это будет иметь значение либо AF_INET или AF_INET6 (или теоретически любой другой поддерживаемый протокол)

Вызов getaddrinfo() будет искать имя хоста и разрешить его на IPv4 или IPv6, и вы передаете результат в socket(), чтобы создать сокет соответствующего типа. Если имя хоста разрешено для хоста IPv4, вы создаете сокет, который может работать с IPv4. Если он разрешает IPv6, вы создаете сокет IPv6.

Если вы вместо этого жестко закодировали значения, например. как AF_INET, вы бы поддерживали только IPv4, тогда как ptr->ai_family может быть либо AF_INET, либо AF_INET6.

+0

Спасибо! это так понятно! До сих пор я не нашел одного легкого для понимания учебника по теме Winsock XD. –

Смежные вопросы