Route Set : SioCADDRT 실패 : 장치 용 부적절한 IOCTL
-
20-12-2019 - |
문제
이 일반적인 "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이 탐지되어야합니다.
제휴하지 않습니다 StackOverflow