이 예제는 /proc/net/route를 읽어들여 Routing Table을 출력해준다. proc filesystem은 별도의 System Call을 사용하지 않아서 편하기는 하지만, 단순히 Linux에서만 사용할 수 있다는 단점 때문에, 다른 System Call을 찾아보았지만 별다른 방법이 보이지 않았다. FreeBSD의 default router를 가져오는 방법을 찾을때에 참조한 openvpn의 소스에서도, 같은 방식으로 참조하고 있다. (어짜피 text file handing이기 때문에 방식은 거의 유사하다.) 참고 사이트 : Getting the IP address of the local host (여기의 답글에서 인용하긴 했지만, Export Exchange가 Login을 하지 않으면 답글이 보이지 않는 구조라...)
/proc/net/route에서 Routing Table 출력, 샘플 /proc/net/route에서 Routing Table 출력, 샘플 닫기.
소스를 첨부한다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define IP_PRINT(a) \ *((unsigned char *)(&a)), \ *(((unsigned char *)(&a)) + 1), \ *(((unsigned char *)(&a)) + 2), \ *(((unsigned char *)(&a)) + 3) int main() { FILE* fp = fopen("/proc/net/route", "r"); char buf[256]; static char iface[256]; unsigned int destination, gateway, flags, refcnt, use, metric, mask; int ret; if (fp == NULL) exit(-1); while (fgets(buf, 255, fp)) { if (!strncmp(buf, "Iface", 5)) continue; ret = sscanf(buf, "%s\t%x\t%x\t%d\t%d\t%d\t%d\t%x", iface, &destination, &gateway, &flags, &refcnt, &use, &metric, &mask); if (ret < 8) { fprintf(stderr, "ERROR: line read error\n"); continue; } if (destination != 0) { fprintf(stderr, "%s: gateway %u.%u.%u.%u, " "destination %u.%u.%u.%u netmask %u.%u.%u.%u\n", iface, IP_PRINT(gateway), IP_PRINT(destination), IP_PRINT(mask)); continue; } if (mask != 0) { fprintf(stderr, "%s: gateway %u.%u.%u.%u, default, " "but have netmask %u.%u.%u.%u???\n", iface, IP_PRINT(gateway), IP_PRINT(mask)); continue; } fprintf(stderr, "%s: gateway %u.%u.%u.%u, default\n", iface, IP_PRINT(gateway)); } fclose(fp); } 간단하다;
/proc/net/route에서 Routing Table 출력, 샘플 닫기.