2009-02-13 40 views
9

Làm cách nào bạn tìm thấy cổng mặc định của bảng định tuyến bằng C trên Linux?Cổng mặc định trong C trên Linux

Tôi không muốn thực hiện cuộc gọi đến trình bao hoặc đọc tệp. Có ioctls để thêm và xóa các tuyến đường (SIOCADDRT, SIOCDELRT) và tôi đã tìm thấy trên tham chiếu để nhận các tuyến đường (SIOCGRTCONF) nhưng có vẻ như phiên bản hạt nhân tôi đang sử dụng không hỗ trợ SIOCGRTCONF.

+0

NIC không có cổng mặc định, bảng định tuyến có cổng mặc định. – womble

Trả lời

5

Có thể bạn sẽ cần phải sử dụng ổ cắm NETLINK_ROUTE, một phần của ổ cắm của PF_NETLINK. Kiểm tra mã nguồn của phần chương trình 'ip' của 'iproute'. Cụ thể, tiểu mục 'lộ trình' của nó.

+0

Đây là liên kết đến mã mẫu. http://www.linuxquestions.org/questions/linux-networking-3/howto-find-gateway-address-through-code-397078/ Tôi đã thực hiện điều này với một số sửa đổi và hoạt động tốt. – Matt

8

Tôi nghĩ đọc/proc/net/tuyến đường sẽ là đặt cược tốt nhất của bạn. Bạn có coi đây là "tệp" không?

Định dạng/proc/net/route là nổi tiếng và trong bộ nhớ, vì vậy không có hình phạt I/O hoặc sợ thay đổi này (ví dụ: so với đọc nội dung nào đó từ/etc/network/*)

3

Bạn có thể sử dụng/proc/net/tuyến đường như thế này:

int GetDefaultGw (std::string & gw) 
{ 
    FILE *f; 
    char line[100] , *p , *c, *g, *saveptr; 
    int nRet=1; 

    f = fopen("/proc/net/route" , "r"); 

    while(fgets(line , 100 , f)) 
    { 
     p = strtok_r(line , " \t", &saveptr); 
     c = strtok_r(NULL , " \t", &saveptr); 
     g = strtok_r(NULL , " \t", &saveptr); 

     if(p!=NULL && c!=NULL) 
     { 
      if(strcmp(c , "00000000") == 0) 
      { 
       //printf("Default interface is : %s \n" , p); 
       if (g) 
       { 
        char *pEnd; 
        int ng=strtol(g,&pEnd,16); 
        //ng=ntohl(ng); 
        struct in_addr addr; 
        addr.s_addr=ng; 
        gw=std::string(inet_ntoa(addr)); 
        nRet=0; 
       } 
       break; 
      } 
     } 
    } 

    fclose(f); 
    return nRet; 
} 
+1

Nếu bạn có nhiều giao diện, bạn nên kiểm tra tên giao diện trong câu lệnh if thứ 2. – 3bdalla

+1

Nó phải sử dụng 'strtoul', nếu không một số tình huống sẽ tràn. ví dụ, cổng mặc định là FEFEFEA9 ('169.254.254.254'). Nó phải là 'unsigned long int ng = strtoul (g, & pEnd, 16);' –

Các vấn đề liên quan