PDA

Просмотр полной версии : определения типа соединения


gevara
01.05.2007, 23:19
необходимо омределить локальный ИП адрес компьютера. я делаю это при помощи gethostbyname(0). выдаётся несколько IP адресов. Необходимо отфильтровать все интернет (ADSL/DIALUP/TAP/PPP) соединения.
Вопрос: как определить тип соединения для каждого IP адреса?

slesh
02.05.2007, 15:14
2 gevara А ты не пробывал просто проверять по маске эти IP.
т.е. если у тебя же в любом случае будут IP которые практически одинаковы.
т.е. если сеть, то к примеру 192,168,*,* или чтото в этом роде.
Конечно есть вариант еще вот какой:
Запускаешь прогу ipconfig, считываешь всё что она тебе написала и от туда выдираешь типы подключений и IP

Sn@k3
02.05.2007, 15:19
slesh прав, вот только можно через командную строку удобнее (cmd.exe) и запускаем банально ipconfig с флагом /all =)

Nix*
02.05.2007, 18:18
slesh прав, вот только можно через командную строку удобнее (cmd.exe) и запускаем банально ipconfig с флагом /all =)
А вот лучше так не делать. так как зависит от системы..
Какая ОС стоит.XP выдаёт немного другие данные.
Показывает все подключени на машине но при этом бывают глюги у SP1.
Лучше пробуй 1.вриант.

Ch3ck
02.05.2007, 18:45
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; Вот проверил работает.
Переписать немного можно.

slesh
02.05.2007, 20:33
2 BlackLogic Если я не ошибаюсь, то выведет данные только текущего соединения, а не всех. Может у человека на компе Спутник+ADSL+LAN+ еще чтонить и ему нужно оперделить типы всех соединений!

gevara
03.05.2007, 12:07
Что касается проверки по маске - бред. ничего хорошего тут не получится. вот, например, у меня при подключении по локальной сети, пров выделил мне адрес 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
);