определения типа соединения

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by gevara, 1 May 2007.

  1. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    необходимо омределить локальный ИП адрес компьютера. я делаю это при помощи gethostbyname(0). выдаётся несколько IP адресов. Необходимо отфильтровать все интернет (ADSL/DIALUP/TAP/PPP) соединения.
    Вопрос: как определить тип соединения для каждого IP адреса?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 gevara А ты не пробывал просто проверять по маске эти IP.
    т.е. если у тебя же в любом случае будут IP которые практически одинаковы.
    т.е. если сеть, то к примеру 192,168,*,* или чтото в этом роде.
    Конечно есть вариант еще вот какой:
    Запускаешь прогу ipconfig, считываешь всё что она тебе написала и от туда выдираешь типы подключений и IP
     
  3. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    438
    Reputations:
    90
    slesh прав, вот только можно через командную строку удобнее (cmd.exe) и запускаем банально ipconfig с флагом /all =)
     
  4. Nix*

    Nix* Banned

    Joined:
    22 Apr 2007
    Messages:
    9
    Likes Received:
    12
    Reputations:
    -18
    А вот лучше так не делать. так как зависит от системы..
    Какая ОС стоит.XP выдаёт немного другие данные.
    Показывает все подключени на машине но при этом бывают глюги у SP1.
    Лучше пробуй 1.вриант.
     
  5. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,191
    Reputations:
    430
    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;
    Вот проверил работает.
    Переписать немного можно.
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 BlackLogic Если я не ошибаюсь, то выведет данные только текущего соединения, а не всех. Может у человека на компе Спутник+ADSL+LAN+ еще чтонить и ему нужно оперделить типы всех соединений!
     
  7. gevara

    gevara Elder - Старейшина

    Joined:
    29 Nov 2006
    Messages:
    47
    Likes Received:
    7
    Reputations:
    5
    Что касается проверки по маске - бред. ничего хорошего тут не получится. вот, например, у меня при подключении по локальной сети, пров выделил мне адрес 10.20.16.188. подключение локальное, НО тип соединения PPPoE, а это подключение к интернету. С другой стороны существуют стандартные маски локальных адресов:
    10.*.*.*, 192.168.*.*, 172.х.з.* вроде так. но часто находятся сети, в которых адреса распределены по другому.

    Всем пасиб за ответы, особенно BlackLogic. Только вот надо бы тоже самое для всех адресов, выдаваемых gethostbyname(0). попробую дизасмить эту функцию.

    Ещё. у меня она выдаёт значение 0x51.
     
    #7 gevara, 3 May 2007
    Last edited: 3 May 2007
  8. [53x]Shadow

    [53x]Shadow Leaders of Antichat

    Joined:
    25 Jan 2007
    Messages:
    284
    Likes Received:
    597
    Reputations:
    514
    Я думаю, тебе надо юзать 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
    );
     
    1 person likes this.