Страница: 1 |
Страница: 1 |
Вопрос: Определение основного шлюза
Добавлено: 30.05.05 23:07
Автор вопроса: Danger_Man | Web-сайт:
Как это можно сделать?
то есть необходимо определить основной шлюз, который выводится по команде route print
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #1
Добавлено: 31.05.05 11:26
debug.print GetDefaultGateway()
модуль:
Option Explicit
Public Const MAX_HOSTNAME_LEN = 132
Public Const MAX_DOMAIN_NAME_LEN = 132
Public Const MAX_SCOPE_ID_LEN = 260
Public Const MAX_ADAPTER_NAME_LENGTH = 260
Public Const MAX_ADAPTER_ADDRESS_LENGTH = 8
Public Const MAX_ADAPTER_DESCRIPTION_LENGTH = 132
Public Const ERROR_BUFFER_OVERFLOW = 111
Public Const MIB_IF_TYPE_ETHERNET = 6
Public Const MIB_IF_TYPE_TOKENRING = 9
Public Const MIB_IF_TYPE_FDDI = 15
Public Const MIB_IF_TYPE_PPP = 23
Public Const MIB_IF_TYPE_LOOPBACK = 24
Public Const MIB_IF_TYPE_SLIP = 28
Type IP_ADDR_STRING
Next As Long
IpAddress As String * 16
IpMask As String * 16
Context As Long
End Type
Type IP_ADAPTER_INFO
Next As Long
ComboIndex As Long
AdapterName As String * MAX_ADAPTER_NAME_LENGTH
 escription As String * MAX_ADAPTER_DESCRIPTION_LENGTH
AddressLength As Long
Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte
Index As Long
Type As Long
 hcpEnabled As Long
CurrentIpAddress As Long
IpAddressList As IP_ADDR_STRING
GatewayList As IP_ADDR_STRING
 hcpServer As IP_ADDR_STRING
HaveWins As Byte
PrimaryWinsServer As IP_ADDR_STRING
SecondaryWinsServer As IP_ADDR_STRING
LeaseObtained As Long
LeaseExpires As Long
End Type
Type FIXED_INFO
HostName As String * MAX_HOSTNAME_LEN
 omainName As String * MAX_DOMAIN_NAME_LEN
CurrentDnsServer As Long
 nsServerList As IP_ADDR_STRING
NodeType As Long
ScopeId As String * MAX_SCOPE_ID_LEN
EnableRouting As Long
EnableProxy As Long
EnableDns As Long
End Type
Public Declare Function GetNetworkParams Lib "IPHlpApi.dll" _
 FixedInfo As Any, pOutBufLen As Long) As Long
Public Declare Function GetAdaptersInfo Lib "IPHlpApi.dll" _
 IpAdapterInfo As Any, pOutBufLen As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
 Destination As Any, Source As Any, ByVal Length As Long)
Public Function GetDefaultGateway() As String
Dim error As Long
Dim FixedInfoSize As Long
Dim AdapterInfoSize As Long
Dim i As Integer
Dim PhysicalAddress As String
Dim NewTime As Date
Dim AdapterInfo As IP_ADAPTER_INFO
Dim AddrStr As IP_ADDR_STRING
Dim FixedInfo As FIXED_INFO
Dim Buffer As IP_ADDR_STRING
Dim pAddrStr As Long
Dim pAdapt As Long
Dim Buffer2 As IP_ADAPTER_INFO
Dim FixedInfoBuffer() As Byte
Dim AdapterInfoBuffer() As Byte
AdapterInfoSize = 0
error = GetAdaptersInfo(ByVal 0&, AdapterInfoSize)
If error <> 0 Then
If error <> ERROR_BUFFER_OVERFLOW Then
MsgBox "GetAdaptersInfo sizing failed with error " & error
Exit Function
End If
End If
ReDim AdapterInfoBuffer(AdapterInfoSize - 1)
error = GetAdaptersInfo(AdapterInfoBuffer(0), AdapterInfoSize)
If error <> 0 Then
MsgBox "GetAdaptersInfo failed with error " & error
Exit Function
End If
CopyMemory AdapterInfo, AdapterInfoBuffer(0), AdapterInfoSize
pAdapt = AdapterInfo.Next
CopyMemory Buffer2, AdapterInfo, AdapterInfoSize
GetDefaultGateway = Buffer2.GatewayList.IpAddress
End Function
Номер ответа: 2
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #2
Добавлено: 31.05.05 11:30
http://support.microsoft.com/?kbid=223025
Номер ответа: 3
Автор ответа:
Danger_Man
ICQ: 193871483
Вопросов: 1
Ответов: 4
Web-сайт:
Профиль | | #3
Добавлено: 31.05.05 12:42
Огромное спасибо!)
Если несложно - еще одна задачка)
чтобы не вызывать командную строку для добавления нового маршрута и удаления старого - как это сделать средствами VB?
route add 65.109.239.29 определенный_шлюз
route delete 0.0.0.0
Номер ответа: 4
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #4
Добавлено: 31.05.05 14:47
сложно... но интересно Этим все на C занимаются.
dwForwardDest As Long
dwForwardMask As Long
dwForwardPolicy As Long
dwForwardNextHop As Long
dwForwardIfIndex As Long
dwForwardType As Long
dwForwardProto As Long
dwForwardAge As Long
dwForwardNextHopAS As Long
dwForwardMetric1 As Long
dwForwardMetric2 As Long
dwForwardMetric3 As Long
dwForwardMetric4 As Long
dwForwardMetric5 As Long
End Type
Private Declare Function CreateIpForwardEntry Lib "IPHlpApi.dll" (ByRef pRoute As Any) As Long
Private Declare Function DeleteIpForwardEntry Lib "IPHlpApi.dll" (ByRef pRoute As Any) As Long 'тут не уверен
Private Declare Function inet_addr Lib "wsock32.dll" (ByVal HostName As String) As Long
ByVal sForwardDestination As String, _
ByVal sForwardMask As String, _
ByVal sGateway As String) As Boolean
Dim IPForwardTable As MIB_IPFORWARDROW
With IPForwardTable
.dwForwardDest = inet_addr(sForwardDestination)
.dwForwardIfIndex = sInterfaceIndex
.dwForwardMask = inet_addr(sForwardMask)
.dwForwardNextHop = inet_addr(sGateway)
.dwForwardAge = 0
.dwForwardMetric1 = 5
'dwForwardProto
'2 - MIB_IPPROTO_LOCAL
'3 - PROTO_IP_NETMGMT
'4 - next hop = final dest
'? - PROTO_IP_NT_STATIC
.dwForwardProto = 3
.dwForwardPolicy = 0
If CreateIpForwardEntry(IPForwardTable) = 0 Then MsgBox "Создан" Else: MsgBox "Ошибка"
End With
End Function
Вызов
'GetInterfaceInd = Buffer2.Index 'из предыдущего поста
RouteAdd GetInterfaceInd, "157.0.0.0", "255.0.0.0", "10.0.0.0"
для удаления подошла та-же функция, только с вызовом DeleteIpForwardEntry. Для удаления чисто по IP видимо надо как-то узнавать остальные параметры таблицы маршрутов.
Номер ответа: 5
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #5
Добавлено: 01.06.05 22:22
моно проще... создай прораммно батик, напиши всё что надо в него и запусти.
Номер ответа: 6
Автор ответа:
Danger_Man
ICQ: 193871483
Вопросов: 1
Ответов: 4
Web-сайт:
Профиль | | #6
Добавлено: 02.06.05 12:54
В том-то и дело, что хотелось бы от батника уйти вообще))
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 02.06.05 13:34
шлюз? может он реестре хранится?
Номер ответа: 8
Автор ответа:
Danger_Man
ICQ: 193871483
Вопросов: 1
Ответов: 4
Web-сайт:
Профиль | | #8
Добавлено: 03.06.05 16:10
2 Sur:
Не знаешь, что за ерунда - На компьютере несколько подключений.
Если одно включено - то шлюз не определяет. (хотя он даже в сетевой плате прописан)
включаешь другое, то все нормально.
Номер ответа: 9
Автор ответа:
Danger_Man
ICQ: 193871483
Вопросов: 1
Ответов: 4
Web-сайт:
Профиль | | #9
Добавлено: 03.06.05 16:17
p.s.: про команде route print шлюз при этом определяется нормально.
а вообще - как сделать, чтобы при
shell=("route print"
данные сохранялись, скажем, в textbox или richtextbox?
вариант с shell=("route print >>info.txt" не подходит, т.к. из-за кэша нельзя сразу же считать файл
Номер ответа: 10
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #10
Добавлено: 06.06.05 12:02
про ерунду - нет возможности экпериментировать.
а про то, как достать данные консольного окна... ищем примеры работы с консолью.
Для начала (если через файл) попробуй так
ret = Shell("net.bat >tmp", vbNormalFocus)
pHandle = OpenProcess(&H100000, True, ret)
WaitForProcessToEnd = WaitForSingleObject(pHandle, INFINITE)
затем читай файл.