无法从python设置默认网关

2024-09-28 22:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用C语言编写了用ioctl设置默认网关的代码。我有一个设置网关的函数和常用的main函数。当我编译并运行代码时,它工作得很好,但是当我将其转换为库并使用ctypes从python调用main函数时,ioctl调用失败。为什么会这样?你知道吗

注意:在使用ctypes方法之前,我尝试使用fcntlioctlsocket从python设置gateway,但是失败了,OSErrorinvalid arguments。你知道吗

网关.c

int setDefaultGW( int sockfd, char* gatewatStr)
{

    struct sockaddr_in *dst, *gw, *mask;
    struct rtentry route;
    in_addr_t gip;

    fprintf( stderr,"socket %d\n", sockfd);
    fprintf( stderr,"Address %s\n", gatewatStr);
    gip = inet_addr(gatewatStr);
    fprintf( stderr,"Address %d\n", gip);

memset(&route,0,sizeof(struct rtentry));

dst = (struct sockaddr_in *)(&(route.rt_dst));
gw = (struct sockaddr_in *)(&(route.rt_gateway));
mask = (struct sockaddr_in *)(&(route.rt_genmask));

/* Make sure we're talking about IP here */
dst->sin_family = AF_INET;
gw->sin_family = AF_INET;
mask->sin_family = AF_INET;

/* Set up the data for adding the default route */
dst->sin_addr.s_addr = inet_addr("0.0.0.0");
gw->sin_addr.s_addr = gip;
mask->sin_addr.s_addr = inet_addr("0.0.0.0");
route.rt_metric = 100;
route.rt_flags = RTF_UP | RTF_GATEWAY;

/* Remove this route if it already exists */
ioctl(sockfd,SIOCDELRT,&route);

/* Add the default route */
if( ioctl(sockfd,SIOCADDRT,&route) < 0 )
{
    fprintf( stderr,"Adding default route: %d\n", errno);
    return -1;
}

fprintf( stdout,"Added default route successfully.\n" );
return 0;
}

int main(){

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

你知道吗净利润你知道吗

gatewayFun = ctypes.CDLL("./libgateway.so") 
gatewayFun.main()

运行C二进制文件:

./gateway                                                                                                               
socket 3
Address 192.168.6.1
Address 17213632
Added default route successfully.

运行python脚本:

# python3 net.py 
socket 4
Address 192.168.6.1
Address 17213632
Adding default route: 101

Tags: indefaultmainaddresssinsocketroutestruct