RouteInfoクラスに幾つかメソッドを足しました
折角ルート情報が取れるところまで出来たので、やっぱりルート情報の追加とか削除とかも欲しくなって作ってしまいました。
- addRouteEntry(RouteInfo& entry)
- ルート情報の追加
- deleteRouteEntry(RouteInfo& entry)
- ルート情報の削除
になります。
先ずは、RouteInfo.cppに
/* * ルート情報を追加する * param : 追加するルート情報(RouteInfoクラス) * * return : bool * true = 追加できた * false = 追加できなかった */ bool RouteInfo::addRouteEntry(RouteInfo& route_info) { long retCode = NO_ERROR; MIB_IPFORWARDROW row; memset(&row, 0, sizeof(MIB_IPFORWARDROW)); row.dwForwardDest = inet_addr((const char *)_bstr_t(route_info.getDest().c_str())); row.dwForwardMask = inet_addr((const char *)_bstr_t(route_info.getMask().c_str())); row.dwForwardPolicy = 0; row.dwForwardNextHop = inet_addr((const char *)_bstr_t(route_info.getGateway().c_str())); unsigned long ifnum = route_info.getIndex(); if (ifnum == 0) { RouteInfo best = getBestRoute(route_info.getGateway(), route_info.getMask()); ifnum = best.getIndex(); } row.dwForwardIfIndex = ifnum; row.dwForwardProto = MIB_IPPROTO_NETMGMT; row.dwForwardAge = 0; row.dwForwardNextHopAS = 0; row.dwForwardMetric1 = (route_info.getMetric() > 0) ? route_info.getMetric() : 1; row.dwForwardMetric2 = ~0; row.dwForwardMetric3 = ~0; row.dwForwardMetric4 = ~0; row.dwForwardMetric5 = ~0; int metric = row.dwForwardMetric1; do { for (unsigned int type = MIB_IPROUTE_TYPE_DIRECT; type <= MIB_IPROUTE_TYPE_INDIRECT; type++) { row.dwForwardType = type; retCode = CreateIpForwardEntry(&row); if (retCode == NO_ERROR) { break; } } row.dwForwardMetric1 = ++metric; } while ((retCode != NO_ERROR) && (metric < 1024)); if (retCode == NO_ERROR) { return true; } return false; } /* * ルート情報を削除する * param : 削除するルート情報(RouteInfoクラス) * * return : bool * true = 削除できた * false = 削除できなかった */ bool RouteInfo::deleteRouteEntry(RouteInfo& route_info) { long retCode = NO_ERROR; MIB_IPFORWARDROW row; memset(&row, 0, sizeof(MIB_IPFORWARDROW)); row.dwForwardDest = inet_addr((const char *)_bstr_t(route_info.getDest().c_str())); row.dwForwardMask = inet_addr((const char *)_bstr_t(route_info.getMask().c_str())); row.dwForwardPolicy = 0; unsigned long ifnum = route_info.getIndex(); if (route_info.getGateway().empty()) { RouteInfo best = getBestRoute(route_info.getGateway(), route_info.getMask()); row.dwForwardNextHop = inet_addr((const char *)_bstr_t(best.getGateway().c_str())); ifnum = best.getIndex(); } else { row.dwForwardNextHop = inet_addr((const char *)_bstr_t(route_info.getGateway().c_str())); if (ifnum == 0) { RouteInfo best = getBestRoute(route_info.getGateway(), route_info.getMask()); ifnum = best.getIndex(); } } row.dwForwardIfIndex = ifnum; row.dwForwardProto = MIB_IPPROTO_NETMGMT; row.dwForwardAge = 0; row.dwForwardNextHopAS = 0; row.dwForwardMetric1 = 0; row.dwForwardMetric2 = ~0; row.dwForwardMetric3 = ~0; row.dwForwardMetric4 = ~0; row.dwForwardMetric5 = ~0; for (unsigned int type = MIB_IPROUTE_TYPE_DIRECT; type <= MIB_IPROUTE_TYPE_INDIRECT; type++) { row.dwForwardType = type; retCode = DeleteIpForwardEntry(&row); if (retCode == NO_ERROR) { break; } } if (retCode == NO_ERROR) { return true; } return false; }
の二つのメソッドを追加しました。
ついでにJavaにも実装して、
RouteInfo.javaクラスに
public static native boolean addRoute(RouteInfo entry); public static native boolean delRoute(RouteInfo entry);
を追加した後、いつものようにjavahでヘッダファイルを作成して、
JNIとなるjnirouteinfo.cppに
JNIEXPORT jboolean JNICALL Java_net_RouteInfo_addRoute(JNIEnv *env, jclass cls, jobject entry) { RouteInfo rt_entry = load_value(env, entry); return (jboolean)RouteInfo::addRouteEntry(rt_entry); } JNIEXPORT jboolean JNICALL Java_net_RouteInfo_delRoute(JNIEnv *env, jclass cls, jobject entry) { RouteInfo rt_entry = load_value(env, entry); return (jboolean)RouteInfo::deleteRouteEntry(rt_entry); }
を追加しました。
Javaのテストプログラムに
RouteInfo[] ris = RouteInfo.getRouteList(); for (int i = 0; i < ris.length; i++) { printRoute(ris[i]); } RouteInfo entry = new RouteInfo(2, "202.239.113.0", "255.255.255.0", "172.16.255.1", 0, 10, false, false); RouteInfo.addRoute(entry); System.out.println("After add route"); ris = RouteInfo.getRouteList(); for (int i = 0; i < ris.length; i++) { printRoute(ris[i]); } RouteInfo.delRoute(entry); System.out.println("After delete route"); ris = RouteInfo.getRouteList(); for (int i = 0; i < ris.length; i++) { printRoute(ris[i]); }
のロジックを追加してテストして完了です。