![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| salik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 28.1.2011 Репутация: 1 Всего: 1 |
Помогите разобраться как получить данные из этой функции.
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
Сначала неплохо бы сформулировать понятный другим вопрос.
Какие данные? То, что в Memo1 добавляются? И вообще код местами бредовый написан. -------------------- There are always someone smarter than you... |
|||
|
||||
| salik |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 28.1.2011 Репутация: 1 Всего: 1 |
Хорошо. Я напишу как сам понимаю эту кухню, а вы меня поправьте, если не прав. Основная задача - это определить IP по имени хоста. Функция getaddrinfo как раз этим и занимается. После изучения MSDN пришел к следующему описанию структуры
функция принимает 4 параметра. Первые два: имя хоста и имя сервиса, соответственно. остальные два указатели на структуру addrinfo; Из примера видно что третий параметр заполняется программистом, а четвертый служит как результат выполнения функции, который нужно потом проанализировать. Сложность заключается в том, что я не знаком с языком C++ и приведенные примеры не дают ответы. Проблема в том, что функция отрабатывает с ошибкой (11003). Это возможно связано с неправильным описанием структуры. Если третий параметр задать nil, то ошибок нет, но опятьже, как мне получить IP в текстовом формате. |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
||||
|
||||
| salik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 28.1.2011 Репутация: 1 Всего: 1 |
Эта функция уже устарела. И передовые разработчики Windows Sockets 2 рекомендуют использовать getaddrinfo. Об этом написано на сайте Microsoft Поймите меня правильно, надо разобраться именно со структурой и в каком виде "закинуть" в функцию параметры. Если написано, что надо определить адрес конкретной функцией, значит именно ей. Если есть что по существу, то помогите пожалуйста. |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Заполни все поля структуры rez1
Все поля кроме ai_flags,ai_family,ai_socktype и ai_protocol должны содержать либо 0, либо nil Это сообщение отредактировал(а) Чучмек - 5.3.2011, 22:25 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| salik |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 28.1.2011 Репутация: 1 Всего: 1 |
А что именно бредового вы нашли в коде? "Чучмек" спасибо за участие. Эта переменная (rez1) своего рода подсказка для функции. Это написано почти в самом конце комментариев к функции. Я так полагаю это должно ускорить вычисления. Небольшая поправка в описании структуры. Оказывается указатель на тип SOCKADDR уже объявлен в модуле WinSock2 под именем LPSOCKADDR. Немного изменив код
получаем следующее значение поля Memo
Как видите адрес не правильный. Остается теперь с ним разобраться. |
||||||
|
|||||||
| salik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 28.1.2011 Репутация: 1 Всего: 1 |
Задача решена.
Ниже представлен рабочий код. Не забудьте подключить модуль WinSock2.
Это сообщение отредактировал(а) salik - 6.3.2011, 12:10 |
|||
|
||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
Да, есть пара замечаний по коду.
Зачем нужно по кускам "обнилять", если можно либо FillChar/ZeroMemory вызвать, либо сразу выделить память через AllocMem? -------------------- There are always someone smarter than you... |
||||
|
|||||
| salik |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 28.1.2011 Репутация: 1 Всего: 1 |
1) Если переменная "rez1" не будет равена "nil", то при вызове функции "new" будет ошибка. Это я использовал, чтобы подстраховаться. 2) А что касаемо заполнения, вы правы можно было вызвать сначала ZeroMemory, а потом подправить некоторые поля переменной. На сайте MSDN именно так и показано в примере на C++. Надо будет протестировать на досуге. |
||||||
|
|||||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
1. бесполезная подстраховка для данного случая.
2. А можно вообще обойтись AllocMem - она сразу память "зачистит" после выделения. -------------------- There are always someone smarter than you... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |