2014-03-29 40 views
1

如何從C程序中設置(並替換現有的)默認網絡路線?如果可能的話,我希望不使用shell命令(這是一個低內存嵌入式系統)。您還可以設置默認路由而不指定網關IP地址?在我的應用程序中,我希望使ppp0或eth0成爲默認路由,具體取決於電纜是否插入到eth0中。Linux:如何設置C的默認路由?

感謝, 弗雷德

+1

爲什麼你想避免shell命令? –

+1

太間接,可以使用大量的RAM。這是一個小型的嵌入式系統。我編寫了一個系統,但實際上它會崩潰,因爲它使用了太多的內存映射到busybox命令。 –

回答

2

你可以straceroute命令你是想模仿。這給你提供了相關的系統調用來改變路由。

您可能會對proc(5)接口感興趣,例如,它的/proc/net/route僞文件。請參閱ip(7)

6

您可以通過IOCTL調用來設置C程序的默認路由。

void main() 
{ 
    int sockfd; 
    struct rtentry rt; 

    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sockfd == -1) 
    { 
     perror("socket creation failed\n"); 
     return; 
    } 

    struct sockaddr_in *sockinfo = (struct sockaddr_in *)&rt.rt_gateway; 
    sockinfo->sin_family = AF_INET; 
    sockinfo->sin_addr.s_addr = inet_addr("Your Address"); 

    sockinfo = (struct sockaddr_in *)&rt.rt_dst; 
    sockinfo->sin_family = AF_INET; 
    sockinfo->sin_addr.s_addr = INADDR_ANY; 

    sockinfo = (struct sockaddr_in *)&rt.rt_genmask; 
    sockinfo->sin_family = AF_INET; 
    sockinfo->sin_addr.s_addr = INADDR_ANY; 

    rt.rt_flags = RTF_UP | RTF_GATEWAY; 
    rt.rt_dev = "eth0"; 

    if(ioctl(sockfd, SIOCADDRT, &rt) < 0) 
     perror("ioctl"); 

    return; 
}