необходимо омределить локальный ИП адрес компьютера. я делаю это при помощи gethostbyname(0). выдаётся несколько IP адресов. Необходимо отфильтровать все интернет (ADSL/DIALUP/TAP/PPP) соединения. Вопрос: как определить тип соединения для каждого IP адреса?
2 gevara А ты не пробывал просто проверять по маске эти IP. т.е. если у тебя же в любом случае будут IP которые практически одинаковы. т.е. если сеть, то к примеру 192,168,*,* или чтото в этом роде. Конечно есть вариант еще вот какой: Запускаешь прогу ipconfig, считываешь всё что она тебе написала и от туда выдираешь типы подключений и IP
slesh прав, вот только можно через командную строку удобнее (cmd.exe) и запускаем банально ipconfig с флагом /all =)
А вот лучше так не делать. так как зависит от системы.. Какая ОС стоит.XP выдаёт немного другие данные. Показывает все подключени на машине но при этом бывают глюги у SP1. Лучше пробуй 1.вриант.
Code: uses WinInet; const MODEM = 1; ADLS = 2; PROXY = 4; BUSY = 8; function GetConnectionKind(var strKind: string): Boolean; var flags: DWORD; begin strKind := ''; Result := InternetGetConnectedState(@flags, 0); if Result then begin if (flags and MODEM) = MODEM then strKind := 'Modem'; if (flags and ADSL) = ADSL then strKind := 'ADSL'; if (flags and PROXY) = PROXY then strKind := 'Proxy'; if (flags and BUSY) = BUSY then strKind := 'Modem Busy'; end; end; procedure TForm1.Button1Click(Sender: TObject); var strKind: string; begin if GetConnectionKind(strKind) then ShowMessage(strKind); end; Вот проверил работает. Переписать немного можно.
2 BlackLogic Если я не ошибаюсь, то выведет данные только текущего соединения, а не всех. Может у человека на компе Спутник+ADSL+LAN+ еще чтонить и ему нужно оперделить типы всех соединений!
Что касается проверки по маске - бред. ничего хорошего тут не получится. вот, например, у меня при подключении по локальной сети, пров выделил мне адрес 10.20.16.188. подключение локальное, НО тип соединения PPPoE, а это подключение к интернету. С другой стороны существуют стандартные маски локальных адресов: 10.*.*.*, 192.168.*.*, 172.х.з.* вроде так. но часто находятся сети, в которых адреса распределены по другому. Всем пасиб за ответы, особенно BlackLogic. Только вот надо бы тоже самое для всех адресов, выдаваемых gethostbyname(0). попробую дизасмить эту функцию. Ещё. у меня она выдаёт значение 0x51.
Я думаю, тебе надо юзать RAS API, в частности для получения типов соединений: Для того чтобы узнать все устройства установленные на компьютере, через которые возможно совершить подключение используется функция RasEnumDevice: DWORD RasEnumDevices( LPRASDEVINFO lpRasDevInfo, LPDWORD lpcb, LPDWORD lpcDevices ); Первым же параметром этой функции является указатель на структуру RASDEVINFO: typedef struct tagRASDEVINFO { DWORD dwSize; TCHAR szDeviceType[RAS_MaxDeviceType + 1]; TCHAR szDeviceName[RAS_MaxDeviceName + 1]; } RASDEVINFO; Как и в двух предыдущих случаях, первое поле dwSize содержит размер структуры в байтах. Второй член этой структуры содержит тип найденного устройства и может быть равен одному из следующих значений: #define RASDT_Modem TEXT("modem") #define RASDT_Isdn TEXT("isdn") #define RASDT_X25 TEXT("x25") #define RASDT_Vpn TEXT("vpn") #define RASDT_Pad TEXT("pad") #define RASDT_Generic TEXT("GENERIC") #define RASDT_Serial TEXT("SERIAL") #define RASDT_FrameRelay TEXT("FRAMERELAY") #define RASDT_Atm TEXT("ATM") #define RASDT_Sonet TEXT("SONET") #define RASDT_SW56 TEXT("SW56") #define RASDT_Irda TEXT("IRDA") #define RASDT_Parallel TEXT("PARALLEL") #if (WINVER >= 0x501) #define RASDT_PPPoE TEXT("PPPoE") #endif Поле szDeviceName просто содержит название устройства. Второй аргумент функции RasEnumDevice должен содержать размер буфера lpRasDevInfo. В третьий параметр функция передает число найденных устройств. А так же: Для получения адреса и др. свойств существет структура RASENTRY, которая описывает все возможные настройки и свойства соединения. Ее используют две функции. Итак, рассмотрим многочисленные поля RASENTRY: typedef struct tagRASENTRY { DWORD dwSize; DWORD dwfOptions; // Настройки телефонного номера DWORD dwCountryID; DWORD dwCountryCode; TCHAR szAreaCode[ RAS_MaxAreaCode + 1 ]; TCHAR szLocalPhoneNumber[ RAS_MaxPhoneNumber + 1 ]; DWORD dwAlternateOffset; // // PPP(Протокол Point-to-point)/Ip // RASIPADDR ipaddr; RASIPADDR ipaddrDns; RASIPADDR ipaddrDnsAlt; RASIPADDR ipaddrWins; RASIPADDR ipaddrWinsAlt; // Протокол DWORD dwFrameSize; DWORD dwfNetProtocols; DWORD dwFramingProtocol; // Сценарии TCHAR szScript[ MAX_PATH ]; // Автодозвон TCHAR szAutodialDll[ MAX_PATH ]; TCHAR szAutodialFunc[ MAX_PATH ]; // Устройство TCHAR szDeviceType[ RAS_MaxDeviceType + 1 ]; TCHAR szDeviceName[ RAS_MaxDeviceName + 1 ]; // X.25 TCHAR szX25PadType[ RAS_MaxPadType + 1 ]; TCHAR szX25Address[ RAS_MaxX25Address + 1 ]; TCHAR szX25Facilities[ RAS_MaxFacilities + 1 ]; TCHAR szX25UserData[ RAS_MaxUserData + 1 ]; DWORD dwChannels; // Зарезервировано DWORD dwReserved1; DWORD dwReserved2; #if (WINVER >= 0x401) // Подключение из многих соединений DWORD dwSubEntries; DWORD dwDialMode; DWORD dwDialExtraPercent; DWORD dwDialExtraSampleSeconds; DWORD dwHangUpExtraPercent; DWORD dwHangUpExtraSampleSeconds; // Время простоя до разъединения DWORD dwIdleDisconnectSeconds; #endif #if (WINVER >= 0x500) DWORD dwType; DWORD dwEncryptionType; DWORD dwCustomAuthKey; GUID guidId; TCHAR szCustomDialDll[MAX_PATH]; DWORD dwVpnStrategy; #endif #if (WINVER >= 0x501) DWORD dwfOptions2; DWORD dwfOptions3; TCHAR szDnsSuffix[RAS_MaxDnsSuffix]; DWORD dwTcpWindowSize; TCHAR szPrerequisitePbk[MAX_PATH]; TCHAR szPrerequisiteEntry[RAS_MaxEntryName + 1]; DWORD dwRedialCount; DWORD dwRedialPause; #endif } RASENTRY; функция RasGetEntryProperties позволяет программно получить настройки существующего соединения, функция объявлена следующим образом: DWORD RasGetEntryProperties( LPCTSTR lpszPhonebook, LPCTSTR lpszEntry, LPRASENTRY lpRasEntry, LPDWORD lpdwEntryInfoSize, LPBYTE lpbDeviceInfo, LPDWORD lpdwDeviceInfoSize );