добавление данных в структуру addrinfo в C ++ - PullRequest
0 голосов
/ 03 ноября 2011

любая помощь будет оценена.Я разрабатываю соединение udp, и у меня есть функция, которая инициализирует параметры адреса.вот код

void Socket::InitAddrInfoStruct (struct addrinfo *hints, bool socktype){

/* Setting addrinfo struct */
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4
if(socktype == true)
    hints.ai_socktype = SOCK_DGRAM; // set to SOCK_DGRAM to force UDP protocol type
else
    hints.ai_socktype = SOCK_STREAM; // set to SOCK_STREAM to force TCP protocol type
hints.ai_flags = AI_PASSIVE; // use my IP

}

, когда я пытаюсь скомпилировать, я получил следующую ошибку: запрос на член 'ai_family' в 'подсказках', который не являетсятип класса 'addrinfo *'

Может кто-нибудь помочь мне с тем, как я должен добавить данные к подсказкам структуры?

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Это не является частью вашего вопроса, но memset неверен.Вероятно, он должен иметь вид:

memset(hints, 0, sizeof(struct addrinfo));

В ответ на комментарий: в этом случае переменная является указателем, поэтому sizeof(hints) будет 4 байта (или 8 байтов в 64-битной системе).).Это также может быть записано sizeof(*hints) (по сути говоря, размер структуры, на которую указывает переменная).Таким образом, различие в этом случае заключается в том, ссылаетесь ли вы на саму структуру или на указатель на структуру.

В действительности, вызов memset в OP является "последовательным".Он устанавливает значение переменной hints в 0 и передает адрес переменной &hints в функцию memset, а размер этой переменной - как число байтов в memset.Таким образом, вызов был «непротиворечивым» и «правильным», но в результате он очистил бы переменную, и следующий оператор (hints-> ai_family) разыменовал бы нулевой указатель.Так что, хотя «правильно», это, вероятно, не было намерением.

1 голос
/ 03 ноября 2011

Ошибка говорит о том, что hints не относится к типу класса и действительно является указателем. Вы должны получить доступ к его членам с помощью -> вместо:

hints->ai_family = AF_UNSPEC;

или альтернативно:

(*hints).ai_family = AF_UNSPEC;

Также, как указал @Anders K., ваш memset, вероятно, неверен, так как вы вызываете его с размером указателя. Должно быть:

 memset(hints, 0, sizeof(*hints) );

или альтернативно:

 memset(hints, 0, sizeof(struct addrinfo) );
0 голосов
/ 03 ноября 2011

звучит так, как будто вам не хватает заголовка

Вы включили заголовок в структуру addrinfo? в windows его Ws2tcpip.h

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