Форум: "Прочее";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Внизне дали пообщаться... Найти похожие ветки
← →
Ketmar © (2007-03-30 11:20) [0]ну и ладно. тогда скажите, как определить gateway по умолчанию. правда ли, что GetIpForwardTable() возвращает его первым?
← →
Ketmar © (2007-03-30 11:39) [1]таки серьёзно спрашиваю. по моим наблюдениям -- первым. просьба проверить на машинах со шлюзами...
← →
Рамиль © (2007-03-30 12:07) [2]Так код давай, проверю, писать лень:)
← →
Ketmar © (2007-03-30 12:11) [3]
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
/* variables used for GetIfForwardTable */
PMIB_IPFORWARDTABLE pIpForwardTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
char szDestIp[128];
char szMaskIp[128];
char szGatewayIp[128];
struct in_addr IpAddr;
int i;
pIpForwardTable = (MIB_IPFORWARDTABLE*) MALLOC(sizeof(MIB_IPFORWARDTABLE));
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
FREE(pIpForwardTable);
pIpForwardTable = (MIB_IPFORWARDTABLE*) MALLOC(dwSize);
if (pIpForwardTable == NULL) {
printf("Error allocating memory\n");
return 1;
}
}
/* Note that the IPv4 addresses returned in
* GetIpForwardTable entries are in network byte order
*/
if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) {
printf("\tNumber of entries: %d\n", (int) pIpForwardTable->dwNumEntries);
for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) {
/* Convert IPv4 addresses to strings */
IpAddr.S_un.S_addr = (u_long) pIpForwardTable->table[i].dwForwardDest;
strcpy_s(szDestIp, sizeof(szDestIp), inet_ntoa(IpAddr) );
IpAddr.S_un.S_addr = (u_long) pIpForwardTable->table[i].dwForwardMask;
strcpy_s(szMaskIp, sizeof(szMaskIp), inet_ntoa(IpAddr) );
IpAddr.S_un.S_addr = (u_long) pIpForwardTable->table[i].dwForwardNextHop;
strcpy_s(szGatewayIp, sizeof(szGatewayIp), inet_ntoa(IpAddr) );
printf("\n\tRoute[%d] Dest IP: %s\n", i, szDestIp);
printf("\tRoute[%d] Subnet Mask: %s\n", i, szMaskIp);
printf("\tRoute[%d] Next Hop: %s\n", i, szGatewayIp);
printf("\tRoute[%d] If Index: %ld\n", i, pIpForwardTable->table[i].dwForwardIfIndex);
printf("\tRoute[%d] Type: %ld\n", i, pIpForwardTable->table[i].dwForwardType);
printf("\tRoute[%d] Proto: %ld\n", i, pIpForwardTable->table[i].dwForwardProto);
printf("\tRoute[%d] Age: %ld\n", i, pIpForwardTable->table[i].dwForwardAge);
printf("\tRoute[%d] Metric1: %ld\n", i, pIpForwardTable->table[i].dwForwardMetric1);
}
FREE(pIpForwardTable);
return 0;
}
else {
printf("\tGetIpForwardTable failed.\n");
FREE(pIpForwardTable);
return 1;
}
(ц) msdn %-)
← →
Ketmar © (2007-03-30 12:12) [4]IPv6 не интересует, только IPv4. надо для NAT-PMP. %-)
← →
Ketmar © (2007-03-30 12:13) [5]зыж да, я пишу на цэ. %-( потому и код такой. %-)
← →
easy © (2007-03-30 12:58) [6]проверил - получился тот же route print, первым - DG, который DHCP раздаёт
← →
easy © (2007-03-30 13:01) [7]
program dg;
{$APPTYPE CONSOLE}
uses
windows, winsock;
type
PMIB_IPFORWARDROW = ^MIB_IPFORWARDROW;
MIB_IPFORWARDROW = record
dwForwardDest: DWORD;
dwForwardMask: DWORD;
dwForwardPolicy: DWORD;
dwForwardNextHop: DWORD;
dwForwardIfIndex: DWORD;
dwForwardType: DWORD;
dwForwardProto: DWORD;
dwForwardAge: DWORD;
dwForwardNextHopAS: DWORD;
dwForwardMetric1: DWORD;
dwForwardMetric2: DWORD;
dwForwardMetric3: DWORD;
dwForwardMetric4: DWORD;
dwForwardMetric5: DWORD;
end;
PMIB_IPFORWARDTABLE = ^MIB_IPFORWARDTABLE;
MIB_IPFORWARDTABLE = record
dwNumEntries: DWORD;
table: array[0..255 - 1] of MIB_IPFORWARDROW;
end;
var
pIpForwardTable: PMIB_IPFORWARDTABLE;
dwSize: ULONG;
bOrder: boolean;
dwStatus: DWORD;
i: integer;
addr: TInAddr;
function GetIpForwardTable(pIpForwardTable: PMIB_IPFORWARDTABLE;
var pdwSize: ULONG; bOrder: BOOL): DWORD; stdcall; external "IPHLPAPI.DLL";
begin
dwSize := 0;
if GetIpForwardTable(nil, dwSize, bOrder) = ERROR_INSUFFICIENT_BUFFER then
begin
GetMem(pIpForwardTable, dwSize);
try
dwStatus := GetIpForwardTable(pIpForwardTable, dwSize, bOrder);
if dwStatus = ERROR_SUCCESS then
begin
for i := 0 to pIpForwardTable.dwNumEntries - 1 do
begin
addr.S_addr := pIpForwardTable.table[i].dwForwardNextHop;
WriteLn(inet_ntoa(addr));
end;
end;
finally
FreeMem(pIpForwardTable);
end;
end;
WriteLn("");
WriteLn("Press Enter");
Readln;
end.
← →
Ketmar © (2007-03-30 13:04) [8]tnx. гут. просто я в проект вмонтировал с расчётом, что оно именно так. проверял лишь на vmware. именно DG мне и нужен.
зыж если у кого будет не так (кому не лениво проверить) -- просьба отписать ситуацию и конфиг. tnx.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c