Здравствуйте, уважаемые
Тема давно не обсуждалась, а ответ тем не менее найден не был
В общем есть функция:
//---------------------------------------------------------------------------
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; не прокатывает