Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как определить адрес DNS?  (Прочитано 23192 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« : 17-08-2004 18:06 » 

Иногда эффективнее "ручками" программировать запросы к DNS-серверу. Отсюда вопрос - как определить адрес DNS (а, лучше, адреса всех DNS, известных системе) программным способом (не заставляя юзера вводить адрес, отображаемый, например, в winipcfg)?
Записан
stragner
Гость
« Ответ #1 : 18-08-2004 00:37 » 

maa, пользуйся функциями winsock2
gethostname(), gethostbyname() и т.д.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #2 : 18-08-2004 03:03 » 

GetNetworkParams(...)
Записан

while (8==8)
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 18-08-2004 04:45 » 

GetNetworkParams - то, что надо. Только в заголовочных файлах Visual C++ 6.0 + SP5, которым я пользуюсь, iphlpapi.h нет. Он есть в MS VC++.NET и Studio 2003? Придётся переходить на разработку из-под XP...
Записан
sss
Специалист

ru
Offline Offline

« Ответ #4 : 18-08-2004 08:12 » 

Не гони. Есть все. Ищи плотнее...
Записан

while (8==8)
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 18-08-2004 08:37 » 

Не груби. В моём MS VC++6.0 нет ни iphlpapi.h, ни упоминания об GetNetworkParams в других хидерах.
Хотя в MSDN 2002 говорится:
Requirements
  Windows NT/2000/XP: Included in Windows 2000 and later.
  Windows 95/98/Me: Included in Windows 98 and later.
  Header: Declared in Iphlpapi.h.
  Library: Use Iphlpapi.lib.

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

Хотя у меня в данный момент больший интерес, как получить адрес DNS для 98-ой, т.к. под ней отлаживаюсь.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 18-08-2004 13:18 » 

maa, надо ставить Platform SDK.  В поставке Visual Studio это действительно нет, по крайней мере не в VS 6.0 Enterprize.

Но тебе незачем тянуть из сети немеряных размеров SDK ради одного заголовка и библиотеки iphlpapi.lib

Собери из документации описания структур данных и объявление нужной функции в отедельный заголовочный файл и компилируйся с ним.  Далее есть два пути.  

Первый -- при старте приложения подгружать библиотеку iphlpapi.dll и выцеплять из неё указатель на GetNetworkParams.  В каждом месте, где тебе надо вызывать GetNetworkParams, вызывай функцию по извлечённому указателю.

Второй -- сгенерировать IPHLPAPI.LIB самостоятельно.  О том, как самому построить загрузочную библиотеку для DLL смотри обсуждение
https://forum.shelek.ru/index.php/topic,3621.0.html
Программу надо будет слинковать с полученной библиотекой.  При этом не надо руками грузить DLL и извлекать указатель на процедуру, в коде можно прямо писать вызов GetNetworkParams

Примерный .def файл для IPHLPAPI в конце поста.  Если его сохранить в файл с именем iphlpapi.def и сказать команду
Код:
link.exe /def{iphlpapi.def /out{iphlpapi.lib

то на выходе получится библиотека для автоматической загрузки функций из iphlpapi.dll

Я пробовал из этого .def файла построить библиотеку -- получилось.  Но линковаться с ней и прогонять примеры не пробовал.  

Удачи.

Код:
EXPORTS
       AddIPAddress
       AllocateAndGetArpEntTableFromStack
       AllocateAndGetIfTableFromStack
       AllocateAndGetIpAddrTableFromStack
       AllocateAndGetIpForwardTableFromStack
       AllocateAndGetIpNetTableFromStack
       AllocateAndGetTcpTableFromStack
       AllocateAndGetUdpTableFromStack
       CreateIpForwardEntry
       CreateIpNetEntry
       CreateProxyArpEntry
       DeleteIPAddress
       DeleteIpForwardEntry
       DeleteIpNetEntry
       DeleteProxyArpEntry
       EnableRouter
       FlushIpNetTable
       FlushIpNetTableFromStack
       GetAdapterIndex
       GetAdapterOrderMap
       GetAdaptersInfo
       GetBestInterface
       GetBestInterfaceFromStack
       GetBestRoute
       GetBestRouteFromStack
       GetFriendlyIfIndex
       GetIcmpStatistics
       GetIcmpStatsFromStack
       GetIfEntry
       GetIfEntryFromStack
       GetIfTable
       GetIfTableFromStack
       GetIgmpList
       GetInterfaceInfo
       GetIpAddrTable
       GetIpAddrTableFromStack
       GetIpForwardTable
       GetIpForwardTableFromStack
       GetIpNetTable
       GetIpNetTableFromStack
       GetIpStatistics
       GetIpStatsFromStack
       GetNetworkParams
       GetNumberOfInterfaces
       GetPerAdapterInfo
       GetRTTAndHopCount
       GetTcpStatistics
       GetTcpStatsFromStack
       GetTcpTable
       GetTcpTableFromStack
       GetUdpStatistics
       GetUdpStatsFromStack
       GetUdpTable
       GetUdpTableFromStack
       GetUniDirectionalAdapterInfo
       InternalCreateIpForwardEntry
       InternalCreateIpNetEntry
       InternalDeleteIpForwardEntry
       InternalDeleteIpNetEntry
       InternalGetIfTable
       InternalGetIpAddrTable
       InternalGetIpForwardTable
       InternalGetIpNetTable
       InternalGetTcpTable
       InternalGetUdpTable
       InternalSetIfEntry
       InternalSetIpForwardEntry
       InternalSetIpNetEntry
       InternalSetIpStats
       InternalSetTcpEntry
       IpReleaseAddress
       IpRenewAddress
       IsLocalAddress
       NTPTimeToNTFileTime
       NTTimeToNTPTime
       NhGetGuidFromInterfaceName
       NhGetInterfaceNameFromGuid
       NhpAllocateAndGetInterfaceInfoFromStack
       NhpGetInterfaceIndexFromStack
       NotifyAddrChange
       NotifyRouteChange
       NotifyRouteChangeEx
       SendARP
       SetAdapterIpAddress
       SetBlockRoutes
       SetIfEntry
       SetIfEntryToStack
       SetIpForwardEntry
       SetIpForwardEntryToStack
       SetIpMultihopRouteEntryToStack
       SetIpNetEntry
       SetIpNetEntryToStack
       SetIpRouteEntryToStack
       SetIpStatistics
       SetIpStatsToStack
       SetIpTTL
       SetProxyArpEntryToStack
       SetRouteWithRef
       SetTcpEntry
       SetTcpEntryToStack
       UnenableRouter
       _PfAddFiltersToInterface@24
       _PfAddGlobalFilterToInterface@8
       _PfBindInterfaceToIPAddress@12
       _PfBindInterfaceToIndex@16
       _PfCreateInterface@24
       _PfDeleteInterface@4
       _PfDeleteLog@0
       _PfGetInterfaceStatistics@16
       _PfMakeLog@4
       _PfRebindFilters@8
       _PfRemoveFilterHandles@12
       _PfRemoveFiltersFromInterface@20
       _PfRemoveGlobalFilterFromInterface@8
       _PfSetLogBuffer@28
       _PfTestPacket@20
       _PfUnBindInterface@4
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
sss
Специалист

ru
Offline Offline

« Ответ #7 : 19-08-2004 04:12 » 

Я и не думал грубить  Жаль . В C Builder 6 так же есть этот х-файл....
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #8 : 19-08-2004 04:20 » 

Я тут как-то столкнулся с проблемой. Функции IcmpXXX не прописаны нигде. Вот так я сделал:

Код:

  // Динамически загрузим ICMP.DLL
  hIcmpDll = LoadLibrary)TEXT)"ICMP.DLL"::;

  if )hIcmpDll == NULL:  EXCEPTION)ERRCODE_LIBRARYINIT, MethodName:;

  // IcmpCreateFile
  pIcmpCreateFile  = )HANDLE )WINAPI *:)void::
  GetProcAddress))HMODULE:hIcmpDll, "IcmpCreateFile":;

  // IcmpSendEcho
pIcmpSendEcho = )DWORD )WINAPI *:
             )HANDLE, IPAddr, LPVOID, WORD,
                  PIP_OPTION_INFORMATION,
                  LPVOID, DWORD, DWORD::
                  GetProcAddress))HMODULE:hIcmpDll,
                  "IcmpSendEcho":;



Ну а структуры из МСДН...
Записан

while (8==8)
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 19-08-2004 11:11 » 

Спасибо всем.

npak, Решение проблемы создания .lib для dll для меня знакомо (у меня есть Avermedia TV тюнер, из управляющей программы которого нужно выходить, если хочешь каптурить изображение другим приложением типа VirtualDub; но при выходе он отключает звук. вот я и писал программку, которая всего-ничего дёргала функцию из одной из его dll-ок; ручками описывать структуры, правда, не приходилось).

sss, А я, когда надо было реализовать пинги, просто создавал сокет
socket ( AF_INET, SOCK_DGRAM, IPPROTO_ICMP )
и далее работал с ним асинхронно по аналогии как с UDP сокетом.
(Под Вижуалом)
Записан
sss
Специалист

ru
Offline Offline

« Ответ #10 : 20-08-2004 00:35 » 

Цитата

...
socket ( AF_INET, SOCK_DGRAM, IPPROTO_ICMP )
и далее работал с ним асинхронно по аналогии как с UDP сокетом.
...


Так доступа к заголовку ICMP нет... :?
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #11 : 20-08-2004 00:37 » 

А в w2k socket ( AF_INET, SOCK_DGRAM, IPPROTO_ICMP ) работает ?
Записан

while (8==8)
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 20-08-2004 04:39 » 

w2k - не проверял. Под 98-ой работало.
А насчёт заголовка - так что тебе от него надо? IcmpType и IcmpCode указываешь как порты, а контрольную сумму winsock сам подсчитает.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #13 : 20-08-2004 07:07 » new

Да было как-то желание поработать с заголовками IP (w2k). Ну я конечно начал пробовать типы сокетов SOCK_RAW - ни фига не работает, давай там по книжкам включать всякие опции типа XX_HDRINCL  (ну или как там не помню...), ну и ни фига. Примеры целые (не свои, из книжек) попробовал - ни фига. Короче как я понял, не получить прямой доступ к заголовкам IP (и даже TCP) . ТОЛЬКО в драйверах.
Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines