مجموعة الطريق :فشل سيوكادرت:إوكتل غير مناسب للجهاز

StackOverflow https://stackoverflow.com//questions/25000609

سؤال

هذا نموذجي" الطريق إضافة الافتراضي غو إب " البرنامج يعطيني خطأ :

فشل سيوكادرت:إوكتل غير مناسب للجهاز

فعلت إفكونفيغ للتحقق من اسم واجهة.هل هناك طريقة لسرد كافة إيوكتل مناسبة لجهازي ?

int main(char** args) {
        int sockfd;
        struct rtentry route;
        struct sockaddr_in *addr;
        int err = 0;

        // create the socket
        if(sockfd = socket(AF_INET, SOCK_DGRAM, 0)<0){
                perror("socket");
                exit(1);
        }

        memset(&route, 0, sizeof(route));
        addr = (struct sockaddr_in*) &route.rt_gateway;
        addr->sin_family = AF_INET;
        addr->sin_addr.s_addr = inet_addr("192.168.10.1");
        addr = (struct sockaddr_in*) &route.rt_dst;
        addr->sin_family = AF_INET;
        addr->sin_addr.s_addr = INADDR_ANY;
        addr = (struct sockaddr_in*) &route.rt_genmask;
        addr->sin_family = AF_INET;
        addr->sin_addr.s_addr = INADDR_ANY;

        route.rt_dev = "eth0";

        route.rt_flags = RTF_UP | RTF_GATEWAY;
        route.rt_metric = 0;
        if ((err = ioctl(sockfd, SIOCADDRT, &route)) != 0) {
                perror("SIOCADDRT failed");
                exit(1);
        }
}

خطأ جديد بعد تغيير الرمز إلى:

 addr = (struct sockaddr_in*) &route.rt_gateway;
        addr->sin_family = AF_INET;
        addr->sin_addr.s_addr = inet_addr("192.168.10.1");
        addr = (struct sockaddr_in*) &route.rt_dst;
        addr->sin_family = AF_INET;
        addr->sin_addr.s_addr = inet_addr("192.168.10.3");
        addr = (struct sockaddr_in*) &route.rt_genmask;
        addr->sin_family = AF_INET;
        addr->sin_addr.s_addr = inet_addr("255.255.255.0");

الناتج غب :

37      if ((err = ioctl(sockfd, SIOCADDRT, &route)) != 0) {
(gdb) p route
$1 = {rt_pad1 = 0, rt_dst = {sa_family = 2, sa_data = "\000\000\300\250\n\003\000\000\000\000\000\000\000"}, 
  rt_gateway = {sa_family = 2, sa_data = "\000\000\300\250\n\001\000\000\000\000\000\000\000"}, 
  rt_genmask = {sa_family = 2, sa_data = "\000\000\377\377\377\000\000\000\000\000\000\000\000"}, 
  rt_flags = 3, rt_pad2 = 0, rt_pad3 = 0, rt_tos = 0 '\000', rt_class = 0 '\000', rt_pad4 = {0, 0, 0}, 
  rt_metric = 0, rt_dev = 0x4008af "em1", rt_mtu = 0, rt_window = 0, rt_irtt = 0}
(gdb) n
38          perror("SIOCADDRT failed");
(gdb) 
SIOCADDRT failed: Invalid argument
هل كانت مفيدة؟

المحلول

أعتقد أن الخطأ هنا:

    // create the socket
    if(sockfd = socket(AF_INET, SOCK_DGRAM, 0)<0)

التعبير socket(AF_INET, SOCK_DGRAM, 0)<0 يتم تقييمها قبل التعيين.يحدث ذلك لأن مشغلي التعيين لديهم أسبقية أقل من استدعاءات الدالة والمقارنات.يمكنك قراءة المزيد عنها في مقالة ويكيبيديا هذه:

إذن ما لديك حقا هو:

    // create the socket
    if(sockfd = (socket(AF_INET, SOCK_DGRAM, 0)<0))

أن يقيم ل:

    // create the socket
    if(sockfd = 0)

لذلك كنت تحاول تنفيذ ioctl() على واصف الملف غير صالح.

لف الواجب بين قوسين أو انقل التعبير خارج الشرط ، مثل هذا:

    // create the socket
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)

بالمناسبة ، دول مجلس التعاون الخليجي أو رنة يجب الكشف عن ذلك إذا كنت تمر -Wall الخيار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top