delphi 获取跃点、网卡序号,添加、删除路由节点
1 uses 2 Windows, WinSock, IpHlpApi, IpRtrMib; 3 4 //获取网卡序号 5 function GetGPIndex(const AIP: AnsiString): Cardinal; 6 var 7 ipinfo, info: PIpAdapterInfo; 8 ips: TIpAddrString; 9 len, nerr: Cardinal; 10 str: AnsiString; 11 ok: Boolean; 12 begin 13 Result := 0; 14 15 len := 0; 16 nerr := GetAdaptersInfo(nil, len); 17 GetMem(ipinfo, len); 18 nerr := GetAdaptersInfo(ipinfo, len); 19 ok := False; 20 if nerr = 0 then 21 begin 22 info := ipinfo; 23 while(info <> nil) do 24 begin 25 ips := info^.IpAddressList; 26 str := StrPas(ips.IpAddress.S); 27 str := Trim(Str); 28 while(str <> '')do 29 begin 30 if SameText(str, AIP) then 31 begin 32 Result := info^.Index; 33 ok := True; 34 Break; 35 end 36 else begin 37 if Assigned(ips.Next) then 38 begin 39 ips := ips.Next^; 40 str := StrPas(ips.IpAddress.S); 41 str := Trim(Str); 42 end 43 else str := ''; 44 end; 45 end; 46 if ok then 47 Break; 48 info := info^.Next; 49 end; 50 end; 51 FreeMem(ipinfo, len); 52 end; 53 54 // 获取跃点 55 function GetHops(const AIP: AnsiString): Cardinal; 56 var 57 pIpForwardTable: PMibIpForwardTable; 58 dwSize, dwStatus,NewGateway: Cardinal; 59 bOrder, needfree: Boolean; 60 i: Integer; 61 begin 62 Result := 30; 63 pIpForwardTable := nil; 64 dwSize := 0; 65 dwStatus := 0; 66 NewGateway := $DDCCBBAA; 67 needfree := False; 68 dwStatus := GetIpForwardTable(pIpForwardTable, dwSize, False); 69 if (dwStatus = ERROR_INSUFFICIENT_BUFFER) then 70 begin 71 GetMem(pIpForwardTable, dwSize); 72 needfree := True; 73 dwStatus := GetIpForwardTable(pIpForwardTable, dwSize, False); 74 end; 75 if dwStatus = ERROR_SUCCESS then 76 begin 77 NewGateway := inet_addr(PAnsiChar(AIP)); 78 for i := 0 to pIpForwardTable^.dwNumEntries - 1 do 79 if pIpForwardTable^.table[i].dwForwardDest = NewGateway then 80 begin 81 Result := pIpForwardTable^.table[i].dwForwardMetric1; 82 Break; 83 end; 84 end; 85 if needfree then 86 FreeMem(pIpForwardTable); 87 end; 88 89 //初始化MibIP AIP: 路由节点 AMask: 节点掩码 ANextHop: 下一节点 ANetwork:网卡序号 AHop: 跃点 90 function InitMibIp(const AIP, AMask, ANextHop: AnsiString; ANetwork, AHop: Cardinal): TMibIpForwardRow; 91 begin 92 FillChar(Result, SizeOf(Result), 0); 93 Result.dwForwardDest := inet_addr(PAnsiChar(AIP)); 94 Result.dwForwardMask := inet_addr(PAnsiChar(AMask)); 95 Result.dwForwardNextHop := inet_addr(PAnsiChar(ANextHop)); 96 Result.dwForwardPolicy := 0; 97 Result.dwForwardIfIndex := ANetwork; 98 Result.dwForwardType := 4; //the next hop is not the final dest 99 Result.dwForwardProto := 3; //PROTO_IP_NETMGMT 100 Result.dwForwardAge := 0; 101 Result.dwForwardNextHopAS := 0; 102 Result.dwForwardMetric1 := AHop; 103 Result.dwForwardMetric2 := $FFFFFFFF; 104 Result.dwForwardMetric3 := $FFFFFFFF; 105 Result.dwForwardMetric4 := $FFFFFFFF; 106 Result.dwForwardMetric5 := $FFFFFFFF; 107 end; 108 109 //添加路由 110 function AddRoute(const AIP, AMask, ANextHop: AnsiString; ANetwork, AHop: Cardinal): Boolean; 111 begin 112 Result := CreateIpForwardEntry(InitMibIp(AIP, AMask, ANextHop, ANetwork, AHop) = NO_ERROR; 113 end; 114 115 //删除路由 116 function DellRoute(const AIP, AMask, ANextHop: AnsiString; ANetwork, AHop: Cardinal): Boolean; 117 begin 118 Result := DeleteIpForwardEntry(InitMibIp(AIP, AMask, ANextHop, ANetwork, AHop) = NO_ERROR; 119 end;