route add как сделать программно?
От: Mikki  
Дата: 28.11.02 12:34
Оценка:
Добрый день уважаемый All.

Не подскажет ли кто-нибудь как программно сделать

route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1

Спасибо заранее.
Re: route add как сделать программно?
От: vasketsov Россия http://ntprog.by.ru
Дата: 28.11.02 12:42
Оценка:
Здравствуйте, Mikki, Вы писали:

M>Не подскажет ли кто-нибудь как программно сделать

M>route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1

Почитай про Ip Helper, то есть, IpHlpApi.dll на msdn.microsoft.com.
Васкецов Сергей
http://registry.km.ru
Re[2]: route add как сделать программно?
От: Mikki  
Дата: 28.11.02 13:58
Оценка:
Здравствуйте, 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 вызывает много вопросов.
Re[3]: route add как сделать программно?
От: vasketsov Россия http://ntprog.by.ru
Дата: 28.11.02 14:08
Оценка:
Здравствуйте, Mikki, Вы писали:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/categorical_listing.asp

Тут надо внизу найти раздел Routing, там ссылки на функции:

CreateIpForwardEntry
DeleteIpForwardEntry
EnableRouter
GetBestInterface
GetBestRoute
GetIpForwardTable
GetRTTAndHopCount
SetIpForwardEntry
UnenableRouter

Успехов.
Васкецов Сергей
http://registry.km.ru
Re[4]: route add как сделать программно?
От: Mikki  
Дата: 02.12.02 21:04
Оценка:
Здравствуйте, vasketsov, Вы писали:

V>Здравствуйте, Mikki, Вы писали:


V>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/categorical_listing.asp


За ссылку спасибо.

V>Тут надо внизу найти раздел Routing, там ссылки на функции:


V>CreateIpForwardEntry — это я как понял меня интересует


Но я побоялся сходу модифицировать routing table и как видно не зря.
Для начала попробовал получить её

void PASCAL ErrMsg()
{
LPVOID lpMsgBuf;

FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
printf("%s\n",lpMsgBuf);
// Free the buffer.
LocalFree( lpMsgBuf );
return;
}

int main(int argc,char *argv[])
{
MIB_IPFORWARDTABLE IpForwardTable;
DWORD dwSize = sizeof(MIB_IPFORWARDTABLE);
DWORD rc;
rc=GetIpForwardTable(&IpForwardTable,&dwSize,FALSE);
switch (rc){
case NO_ERROR :
printf("Ok\n");
break;
case ERROR_INVALID_PARAMETER :
printf("INVALID_PARAMETER\n");
break;
case ERROR_INSUFFICIENT_BUFFER :
printf("ERROR_INSUFFICIENT_BUFFER %d\n",dwSize);
rc=GetIpForwardTable(&IpForwardTable,&dwSize,FALSE);
if (rc == 0)
printf("Ok\n");
else
ErrMsg();
break;
case ERROR_NOT_SUPPORTED :
printf("ERROR_NOT_SUPPORTED\n");
break;
default :
ErrMsg();
}
return 0;
}

Выдает следующее

ERROR_INSUFFICIENT_BUFFER 1580
The operation completed successfully.

Если не тяжело подскажи как с ним бороться.
Спасибо заранее.
Re[5]: route add как сделать программно?
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.12.02 21:25
Оценка:
Здравствуйте, Mikki, Вы писали:


M>Выдает следующее


M>ERROR_INSUFFICIENT_BUFFER 1580

M>The operation completed successfully.

M>Если не тяжело подскажи как с ним бороться.

выделить буфер нужного размера. размер тебе уже вернули в dwSize.

M>Спасибо заранее.
Пользуюсь RSDN@Home 1.0 alpha 15, слушая nigredo04.mp3
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: route add как сделать программно?
От: Haronych  
Дата: 27.09.07 09:02
Оценка:
Здравствуйте, уважаемые

Тема давно не обсуждалась, а ответ тем не менее найден не был

В общем есть функция:
//---------------------------------------------------------------------------
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;
}
//---------------------------------------------------------------------------
void TForm1::DoSetIpForwardEntry(char* pszDest, char* pszNetMask, char* pszGateway, char* pszInterface, DWORD dwMetric)
{
    DWORD dwStatus;

    PMIB_IPFORWARDROW pRow = NULL;
    PMIB_IPADDRTABLE pIpAddrTable = NULL;
    PMIB_IPFORWARDROW routeEntry;        
    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 = NULL;
    dwIfIpAddr = inet_addr(pszInterface);
    if (dwIfIpAddr == INADDR_NONE)
    {
        ShowMessage("IpRoute: Bad Interface "+AnsiString(pszInterface));
        return;
    }


    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 = dwMetric;

    routeEntry.dwForwardProto = MIB_IPPROTO_LOCAL;
    routeEntry.dwForwardMetric2 = (DWORD)-1;
    routeEntry.dwForwardMetric3 = (DWORD)-1;
    routeEntry.dwForwardMetric4 = (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));
    }
}

Вызываю ее таким образом:
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; не прокатывает
Re[6]: route add как сделать программно?
От: Haronych  
Дата: 27.09.07 09:26
Оценка:
Прошу прощения. Надо так:
MIB_IPFORWARDROW routeEntry;
а не так:
PMIB_IPFORWARDROW routeEntry;
Сути вопроса это не меняет
Re[7]: route add как сделать программно?
От: Haronych  
Дата: 27.09.07 09:35
Оценка:
хотя опять же если я поставлю
dwIfIpAddr = 0x2e0005;
ошибка таже самая, а строка
route add 143.86.86.0 MASK 255.255.255.0 169.254.175.247 IF 0x2e0005 проходит
В чем собака? может кто из знающих подскажет?
Re: route add как сделать программно?
От: Haronych  
Дата: 28.09.07 09:49
Оценка:
Доработал функции, получил интерфейс. Проверил все передаваемые параметры. Все равно таже ошибка 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
Оценка:
А может вызвать системную команду и не мучаться?
В скрытом окне...
Re[2]: route add как сделать программно?
От: Haronych  
Дата: 30.09.07 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А может вызвать системную команду и не мучаться?

А>В скрытом окне...

Вариант конечно, но это на крайний случай. Я надеюсь все таки разобраться. Хотя похоже никто этим не заморачивался. Сейчас всем проще route add вызвать чем разобраться как это должно работать. Да я и сам в билдере пишу... Обленился.
Re: route add как сделать программно?
От: Haronych  
Дата: 30.09.07 09:52
Оценка:
Здравствуйте, все

Вопрос закрыт, по крайней мере для меня. Решение найдено. Как всегда всё оказалось намного проще. Раскуривание МСДН на свежую голову есть рулез. Если кому нужно, — спрашивате
Re[2]: route add как сделать программно?
От: Аноним  
Дата: 19.03.09 03:38
Оценка:
Здравствуйте, Haronych, Вы писали:

H>Здравствуйте, все


H>Вопрос закрыт, по крайней мере для меня. Решение найдено. Как всегда всё оказалось намного проще. Раскуривание МСДН на свежую голову есть рулез. Если кому нужно, — спрашивате


Подскажи решение, если не трудно. А то не могу ни как выйти на него.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.