Здравствуйте, vasketsov, Вы писали:
V>Здравствуйте, Mikki, Вы писали:
M>>Не подскажет ли кто-нибудь как программно сделать M>>route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1
V>Почитай про Ip Helper, то есть, IpHlpApi.dll на msdn.microsoft.com.
DWORD RtmAddRoute(
HANDLE ClientHandle, // handle that identifies the client
PVOID Route, // pointer to new route structure
DWORD TimeToLive, // how long to keep the route
DWORD Flags, // best route change status
PVOID CurBestRoute, // pointer to new best route
PVOID PrevBestRoute // pointer to previous best route
);
Это оно или не оно ? Если так то PVOID Route вызывает много вопросов.
M>Выдает следующее
M>ERROR_INSUFFICIENT_BUFFER 1580 M>The operation completed successfully.
M>Если не тяжело подскажи как с ним бороться.
выделить буфер нужного размера. размер тебе уже вернули в dwSize.
M>Спасибо заранее.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *add[4];
add[0]="143.86.86.0";
add[1]="255.255.255.0";
add[2]="169.254.175.247";
add[3]="169.254.175.247";
int ret = iproute(add);
}
Говорит что не может добавить. Я так понимаю из за интерфейса. Потому как руками строка
route add 143.86.86.0 MASK 255.255.255.0 169.254.175.247 проходит, а
route add 143.86.86.0 MASK 255.255.255.0 169.254.175.247 IF 169.254.175.247 непроходит что логично вобщем то.
Как можно вызывать SetIpForwardEntry чтобы оно прописывало без интерфейса?
dwIfIpAddr = NULL; не прокатывает
хотя опять же если я поставлю
dwIfIpAddr = 0x2e0005;
ошибка таже самая, а строка
route add 143.86.86.0 MASK 255.255.255.0 169.254.175.247 IF 0x2e0005 проходит
В чем собака? может кто из знающих подскажет?
Доработал функции, получил интерфейс. Проверил все передаваемые параметры. Все равно таже ошибка 87. Неужели никто ничего не подскажет? Привожу полный исходник может ктонибудь всётаки ответит...
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iphlpapi.h>
#include <winsock2.h>
#include <assert.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HMODULE hLib;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int _cdecl TForm1::iproute(char * arg[])
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int nRet;
DWORD metrick=20;
nRet = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested)
{
return -1;
}
DoSetIpForwardEntry(arg[0], arg[1], arg[2], arg[3], metrick);
WSACleanup();
return 1;
}
//---------------------------------------------------------------------------
//необходимо добавить в таблицу маршрутизации новый маршрут аналогично строке
//route add 143.86.86.0 MASK 255.255.255.0 169.254.112.176
//адрес 169.254.112.176 - динамический, выделяется при модемном подключении
//если в свойствах TCPIP указано "использовать основной шлюз удаленной сети"
//этот адрес автоматически становится шлюзом по умолчанию. Но тогда пропадает
//инет.Если не указано, инет не пропадает но доступ к ресурсам удаленной сети
//можно получить только выполнив вышеприведенную комманду.
//Нужно чтобы при дозвоне на удаленную сеть сразу добавлялся маршрут.
//Дозваниваться и получать IP адрес я уже научился. Осталось сделать маршрут
//Уже неделю долблюсь. Основной шлюз менять получается, но мне это не надо
//а добавить маршрут не могу хоть убей...
//---------------------------------------------------------------------------
void TForm1::DoSetIpForwardEntry(char* pszDest, char* pszNetMask, char* pszGateway, char* pszInterface, DWORD dwMetric)
{
DWORD dwStatus;
MIB_IPFORWARDROW routeEntry;
PMIB_IPADDRTABLE pIpAddrTable = NULL;
DWORD dwIfIndex;
DWORD dwIfMask;
DWORD dwIfIpAddr;
memset(&routeEntry, 0, sizeof(MIB_IPFORWARDROW));
if (pszDest == NULL || pszNetMask == NULL || pszGateway == NULL)
{
ShowMessage("IpRoute: Bad Argument");
return;
}
routeEntry.dwForwardDest = inet_addr(pszDest);
if (routeEntry.dwForwardDest == INADDR_NONE)
{
ShowMessage("IpRoute: Bad Destination "+AnsiString(pszDest));
return;
}
routeEntry.dwForwardMask = inet_addr(pszNetMask);
if ( (routeEntry.dwForwardMask == INADDR_NONE) &&
(strcmp("255.255.255.255", pszNetMask) != 0) )
{
ShowMessage("IpRoute: Bad Mask "+AnsiString(pszNetMask));
return;
}
routeEntry.dwForwardNextHop = inet_addr(pszGateway);
if (routeEntry.dwForwardNextHop == INADDR_NONE)
{
ShowMessage("IpRoute: Bad Gateway "+AnsiString(pszGateway));
return;
}
if ( (routeEntry.dwForwardDest & routeEntry.dwForwardMask) != routeEntry.dwForwardDest)
{
ShowMessage("IpRoute: Invalid Mask "+AnsiString(pszNetMask));
return;
}
dwIfIpAddr = inet_addr(pszInterface);
if (dwIfIpAddr == INADDR_NONE)
{
ShowMessage("IpRoute: Bad Interface "+AnsiString(pszInterface));
return;
}
if ( (dwStatus = MyGetIpAddrTable(pIpAddrTable,1)) != NO_ERROR)
{
ShowMessage("GetIpAddrTable returned 0x"+AnsiString(dwStatus));
if (pIpAddrTable)
free(pIpAddrTable);
return;
}
assert(pIpAddrTable);
if ( InterfaceIpToIdxAndMask(pIpAddrTable, pszInterface, dwIfIndex, dwIfMask) == FALSE)
{
ShowMessage("IpRoute: Bad Argument "+AnsiString(pszInterface));
return;
}
free(pIpAddrTable);
if ( (routeEntry.dwForwardNextHop & dwIfMask) != (dwIfIpAddr & dwIfMask) )
{
ShowMessage("IpRoute: Gateway "+AnsiString(pszGateway)+" and Interface "+AnsiString(pszInterface)+" are not in the same subnet.");
return;
}
routeEntry.dwForwardIfIndex = dwIfIndex;
routeEntry.dwForwardMetric1 = 1;
routeEntry.dwForwardProto = MIB_IPPROTO_LOCAL;
routeEntry.dwForwardMetric2 = (DWORD)-1;
routeEntry.dwForwardMetric3 = (DWORD)-1;
routeEntry.dwForwardMetric4 = (DWORD)-1;
routeEntry.dwForwardMetric5 = (DWORD)-1;
typedef DWORD (WINAPI *SetIpForwardEntryFunc)(MIB_IPFORWARDROW);
static SetIpForwardEntryFunc gSetIpForwardEntry = NULL;
gSetIpForwardEntry = (SetIpForwardEntryFunc)GetProcAddress(hLib, "SetIpForwardEntry");
dwStatus = gSetIpForwardEntry(routeEntry);
if (dwStatus != NO_ERROR)
{
ShowMessage("IpRoute: couldn't add ("+AnsiString(pszDest)+"), dwStatus = "+AnsiString(dwStatus));
}
}
//----------------------------------------------------------------------------
bool TForm1::InterfaceIpToIdxAndMask(PMIB_IPADDRTABLE pIpAddrTable, char str[], DWORD& dwIndex, DWORD& dwMask)
{
DWORD dwIfIpAddr;
if (pIpAddrTable == NULL)
return FALSE;
dwIfIpAddr = inet_addr(str);
if (dwIfIpAddr == INADDR_NONE)
return FALSE;
for (DWORD dwIdx = 0; dwIdx < pIpAddrTable->dwNumEntries; dwIdx++)
{
if (dwIfIpAddr == pIpAddrTable->table[dwIdx].dwAddr)
{
dwIndex = pIpAddrTable->table[dwIdx].dwIndex;
dwMask = pIpAddrTable->table[dwIdx].dwMask;
return TRUE;
}
}
return FALSE;
}
//----------------------------------------------------------------------------
DWORD TForm1::MyGetIpAddrTable(PMIB_IPADDRTABLE& pIpAddrTable, BOOL fOrder)
{
DWORD status = NO_ERROR;
DWORD statusRetry = NO_ERROR;
DWORD dwActualSize = 0;
typedef DWORD (WINAPI *GetIpAddrTableFunc)(PMIB_IPADDRTABLE,PULONG,BOOL);
static GetIpAddrTableFunc gGetIpAddrTable = NULL;
gGetIpAddrTable = (GetIpAddrTableFunc)GetProcAddress(hLib, "GetIpAddrTable");
status = gGetIpAddrTable(pIpAddrTable, &dwActualSize, fOrder);
if (status == NO_ERROR)
{
ShowMessage("No error");
return status;
}
else if (status == ERROR_INSUFFICIENT_BUFFER)
{
pIpAddrTable = (PMIB_IPADDRTABLE) malloc(dwActualSize);
assert(pIpAddrTable);
statusRetry = gGetIpAddrTable(pIpAddrTable, &dwActualSize, fOrder);
return statusRetry;
}
else
{
return status;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char *add[4];
add[0]="143.86.86.0";
add[1]="255.255.255.0";
add[2]="169.254.112.176";
add[3]="169.254.112.176";
int ret = iproute(add);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hLib = LoadLibrary("Iphlpapi.dll");
if (!hLib)
{
ShowMessage("erreur de lecture dela DLL Iphlpapi.dll");
exit(1);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
FreeLibrary(hLib);
}
//---------------------------------------------------------------------------
//Эта функция меняет основной шлюз на указанный в NewGateway.
//Работает без проблем...
void TForm1::AddDefaultGateway()
{
PMIB_IPFORWARDTABLE pIpForwardTable = NULL;
PMIB_IPFORWARDROW pRow = NULL;
DWORD dwSize = 0;
BOOL bOrder = FALSE;
DWORD dwStatus = 0;
DWORD NewGateway = inet_addr("192.168.1.1");
typedef DWORD (WINAPI *GetIpForwardTableFunc)(PMIB_IPFORWARDTABLE,PULONG,BOOL);
static GetIpForwardTableFunc gGetIpForwardTable = NULL;
gGetIpForwardTable = (GetIpForwardTableFunc)GetProcAddress(hLib, "GetIpForwardTable");
dwStatus = gGetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
if (dwStatus == ERROR_INSUFFICIENT_BUFFER) {
if (!(pIpForwardTable = (PMIB_IPFORWARDTABLE)malloc(dwSize))) {
ShowMessage("Malloc failed. Out of memory.");
exit(1);
}
dwStatus = gGetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
}
if (dwStatus != ERROR_SUCCESS) {
ShowMessage("getIpForwardTable failed.");
if (pIpForwardTable)
free(pIpForwardTable);
exit(1);
}
for (unsigned long int i=0; i < pIpForwardTable->dwNumEntries; i++) {
if (pIpForwardTable->table[i].dwForwardDest == 0) {
if (!pRow) {
pRow = (PMIB_IPFORWARDROW)malloc(sizeof(MIB_IPFORWARDROW));
if (!pRow) {
ShowMessage("Malloc failed. Out of memory.");
exit(1);
}
memcpy(pRow, &(pIpForwardTable->table[i]), sizeof(MIB_IPFORWARDROW));
}
typedef DWORD (WINAPI *DeleteIpForwardEntryFunc)(PMIB_IPFORWARDROW);
static DeleteIpForwardEntryFunc gDeleteIpForwardEntry = NULL;
gDeleteIpForwardEntry = (DeleteIpForwardEntryFunc)GetProcAddress(hLib, "DeleteIpForwardEntry");
dwStatus = gDeleteIpForwardEntry(&(pIpForwardTable->table[i]));
if (dwStatus != ERROR_SUCCESS) {
ShowMessage("Could not delete old gateway");
exit(1);
}
}
}
pRow->dwForwardNextHop = NewGateway;
typedef DWORD (WINAPI *SetIpForwardEntryFunc)(PMIB_IPFORWARDROW);
static SetIpForwardEntryFunc gSetIpForwardEntry = NULL;
gSetIpForwardEntry = (SetIpForwardEntryFunc)GetProcAddress(hLib, "SetIpForwardEntry");
dwStatus = gSetIpForwardEntry(pRow);
if (dwStatus == NO_ERROR)
ShowMessage("Gateway changed successfully");
else if (dwStatus == ERROR_INVALID_PARAMETER)
ShowMessage("Invalid parameter.");
else
ShowMessage("Error: "+ dwStatus);
if (pIpForwardTable)
free(pIpForwardTable);
if (pRow)
free(pRow);
}
//---------------------------------------------------------------------------
Re: route add как сделать программно?
От:
Аноним
Дата:
28.09.07 15:17
Оценка:
А может вызвать системную команду и не мучаться?
В скрытом окне...
Здравствуйте, Аноним, Вы писали:
А>А может вызвать системную команду и не мучаться? А>В скрытом окне...
Вариант конечно, но это на крайний случай. Я надеюсь все таки разобраться. Хотя похоже никто этим не заморачивался. Сейчас всем проще route add вызвать чем разобраться как это должно работать. Да я и сам в билдере пишу... Обленился.
Вопрос закрыт, по крайней мере для меня. Решение найдено. Как всегда всё оказалось намного проще. Раскуривание МСДН на свежую голову есть рулез. Если кому нужно, — спрашивате
Re[2]: route add как сделать программно?
От:
Аноним
Дата:
19.03.09 03:38
Оценка:
Здравствуйте, Haronych, Вы писали:
H>Здравствуйте, все
H>Вопрос закрыт, по крайней мере для меня. Решение найдено. Как всегда всё оказалось намного проще. Раскуривание МСДН на свежую голову есть рулез. Если кому нужно, — спрашивате
Подскажи решение, если не трудно. А то не могу ни как выйти на него.