문제

이 일반적인 "Route Add Default GW IP"프로그램은 나에게 오류를 제공합니다 :

SioCADDRT 실패 : 장치에 대한 부적절한 IOCTL

인터페이스 이름을 확인하려면 ifconfig를 수행했습니다. 내 장치에 대한 모든 승인 IOCTL을 나열하는 방법이 있습니까?

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");
.

GDB 출력 :

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)
.

Expression socket(AF_INET, SOCK_DGRAM, 0)<0는 할당 전에 평가됩니다.할당 연산자는 함수 호출 및 비교보다 우선 순위가 낮기 때문에 발생합니다.이 Wikipedia 기사에서 더 많은 것을 읽을 수 있습니다 :

그래서 당신이 정말로 무엇이있는 것은 다음과 같습니다 :

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

- to :

    // create the socket
    if(sockfd = 0)
.

잘못된 파일 설명자에서 ioctl()를 수행하려고합니다.

과제를 괄호로 묶거나 다음과 같이 조건에서 표현을 밖으로 옮깁니다.

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

GCC 또는 Clang이 -Wall 옵션을 전달하면 gcc 또는 clang이 탐지되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top