| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > Функция getaddrinfo |
| Автор: salik 5.3.2011, 14:28 | ||
Помогите разобраться как получить данные из этой функции.
|
| Автор: MetalFan 5.3.2011, 15:27 |
| Сначала неплохо бы сформулировать понятный другим вопрос. Какие данные? То, что в Memo1 добавляются? И вообще код местами бредовый написан. |
| Автор: salik 5.3.2011, 16:17 | ||||
Хорошо. Я напишу как сам понимаю эту кухню, а вы меня поправьте, если не прав. Основная задача - это определить IP по имени хоста. Функция getaddrinfo как раз этим и занимается. После изучения MSDN пришел к следующему описанию структуры
функция принимает 4 параметра. Первые два: имя хоста и имя сервиса, соответственно. остальные два указатели на структуру addrinfo; Из примера видно что третий параметр заполняется программистом, а четвертый служит как результат выполнения функции, который нужно потом проанализировать. Сложность заключается в том, что я не знаком с языком C++ и приведенные http://msdn.microsoft.com/en-us/library/ms738520%28v=VS.85%29.aspx не дают ответы. Проблема в том, что функция отрабатывает с ошибкой (11003). Это возможно связано с неправильным описанием структуры. Если третий параметр задать nil, то ошибок нет, но опятьже, как мне получить IP в текстовом формате. |
| Автор: Snowy 5.3.2011, 16:26 |
| gethostbyname |
| Автор: salik 5.3.2011, 19:53 | ||
Эта функция уже устарела. И передовые разработчики Windows Sockets 2 рекомендуют использовать getaddrinfo. Об этом написано на сайте http://msdn.microsoft.com/en-us/library/ms738524%28VS.85%29.aspx Поймите меня правильно, надо разобраться именно со структурой и в каком виде "закинуть" в функцию параметры. Если написано, что надо определить адрес конкретной функцией, значит именно ей. Если есть что по существу, то помогите пожалуйста. |
| Автор: Чучмек 5.3.2011, 22:00 | ||
Заполни все поля структуры rez1
Все поля кроме ai_flags,ai_family,ai_socktype и ai_protocol должны содержать либо 0, либо nil |
| Автор: Чучмек 5.3.2011, 22:41 | ||
|
| Автор: salik 5.3.2011, 22:41 | ||||||
А что именно бредового вы нашли в коде? "Чучмек" спасибо за участие. Эта переменная (rez1) своего рода подсказка для функции. Это написано почти в самом конце комментариев к функции. Я так полагаю это должно ускорить вычисления. Небольшая поправка в описании структуры. Оказывается указатель на тип SOCKADDR уже объявлен в модуле WinSock2 под именем LPSOCKADDR. Немного изменив код
получаем следующее значение поля Memo
Как видите адрес не правильный. Остается теперь с ним разобраться. |
| Автор: salik 6.3.2011, 09:16 | ||
| Задача решена. Ниже представлен рабочий код. Не забудьте подключить модуль WinSock2.
|
| Автор: MetalFan 9.3.2011, 15:19 | ||||
Да, есть пара замечаний по коду.
Зачем нужно по кускам "обнилять", если можно либо FillChar/ZeroMemory вызвать, либо сразу выделить память через AllocMem? |
| Автор: salik 9.3.2011, 15:57 | ||||||
1) Если переменная "rez1" не будет равена "nil", то при вызове функции "new" будет ошибка. Это я использовал, чтобы подстраховаться. 2) А что касаемо заполнения, вы правы можно было вызвать сначала ZeroMemory, а потом подправить некоторые поля переменной. На сайте MSDN именно так и показано в примере на C++. Надо будет протестировать на досуге. |
| Автор: MetalFan 9.3.2011, 17:25 |
| 1. бесполезная подстраховка для данного случая. 2. А можно вообще обойтись AllocMem - она сразу память "зачистит" после выделения. |