Просмотр полной версии : определения типа соединения
необходимо омределить локальный ИП адрес компьютера. я делаю это при помощи gethostbyname(0). выдаётся несколько IP адресов. Необходимо отфильтровать все интернет (ADSL/DIALUP/TAP/PPP) соединения.
Вопрос: как определить тип соединения для каждого IP адреса?
2 gevara А ты не пробывал просто проверять по маске эти IP.
т.е. если у тебя же в любом случае будут IP которые практически одинаковы.
т.е. если сеть, то к примеру 192,168,*,* или чтото в этом роде.
Конечно есть вариант еще вот какой:
Запускаешь прогу ipconfig, считываешь всё что она тебе написала и от туда выдираешь типы подключений и IP
slesh прав, вот только можно через командную строку удобнее (cmd.exe) и запускаем банально ipconfig с флагом /all =)
slesh прав, вот только можно через командную строку удобнее (cmd.exe) и запускаем банально ipconfig с флагом /all =)
А вот лучше так не делать. так как зависит от системы..
Какая ОС стоит.XP выдаёт немного другие данные.
Показывает все подключени на машине но при этом бывают глюги у SP1.
Лучше пробуй 1.вриант.
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.
[53x]Shadow
03.05.2007, 13:41
необходимо омределить локальный ИП адрес компьютера. я делаю это при помощи gethostbyname(0). выдаётся несколько IP адресов. Необходимо отфильтровать все интернет (ADSL/DIALUP/TAP/PPP) соединения.
Вопрос: как определить тип соединения для каждого IP адреса?
Я думаю, тебе надо юзать 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
);
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot