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; не прокатывает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.