Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   определения типа соединения (https://forum.antichat.xyz/showthread.php?t=39344)

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

Цитата:

Сообщение от gevara
необходимо омределить локальный ИП адрес компьютера. я делаю это при помощи 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
);


Время: 10:18