Interface request structure used for socket ioctl's

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Interface request structure used for socket ioctl's相关的知识,希望对你有一定的参考价值。

1. 结构体定义

/*
 * Interface request structure used for socket
 * ioctl‘s.  All interface ioctl‘s must have parameter
 * definitions which begin with ifr_name.  The
 * remainder may be interface specific.
 */
struct ifreq {
#define IFHWADDRLEN    6
    union
    {
        char    ifrn_name[IFNAMSIZ];        /* if name, e.g. "en0" */
    } ifr_ifrn;
    
    union {
        struct    sockaddr ifru_addr;
        struct    sockaddr ifru_dstaddr;
        struct    sockaddr ifru_broadaddr;
        struct    sockaddr ifru_netmask;
        struct  sockaddr ifru_hwaddr;
        short    ifru_flags;
        int    ifru_ivalue;
        int    ifru_mtu;
        struct  ifmap ifru_map;
        char    ifru_slave[IFNAMSIZ];    /* Just fits the size */
        char    ifru_newname[IFNAMSIZ];
        void *    ifru_data;
        struct    if_settings ifru_settings;
    } ifr_ifru;
};

#define ifr_name    ifr_ifrn.ifrn_name    /* interface name     */
#define ifr_hwaddr    ifr_ifru.ifru_hwaddr    /* MAC address         */
#define    ifr_addr    ifr_ifru.ifru_addr    /* address        */
#define    ifr_dstaddr    ifr_ifru.ifru_dstaddr    /* other end of p-p lnk    */
#define    ifr_broadaddr    ifr_ifru.ifru_broadaddr    /* broadcast address    */
#define    ifr_netmask    ifr_ifru.ifru_netmask    /* interface net mask    */
#define    ifr_flags    ifr_ifru.ifru_flags    /* flags        */
#define    ifr_metric    ifr_ifru.ifru_ivalue    /* metric        */
#define    ifr_mtu        ifr_ifru.ifru_mtu    /* mtu            */
#define ifr_map        ifr_ifru.ifru_map    /* device map        */
#define ifr_slave    ifr_ifru.ifru_slave    /* slave device        */
#define    ifr_data    ifr_ifru.ifru_data    /* for use by interface    */
#define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index    */
#define ifr_bandwidth    ifr_ifru.ifru_ivalue    /* link bandwidth    */
#define ifr_qlen    ifr_ifru.ifru_ivalue    /* Queue length     */
#define ifr_newname    ifr_ifru.ifru_newname    /* New name        */
#define ifr_settings    ifr_ifru.ifru_settings    /* Device/proto settings*/

/*
 * Structure used in SIOCGIFCONF request.
 * Used to retrieve interface configuration
 * for machine (useful for programs which
 * must know all networks accessible).
 */

struct ifconf  {
    int    ifc_len;            /* size of buffer    */
    union {
        char *ifcu_buf;
        struct ifreq *ifcu_req;
    } ifc_ifcu;
};
#define    ifc_buf    ifc_ifcu.ifcu_buf        /* buffer address    */
#define    ifc_req    ifc_ifcu.ifcu_req        /* array of structures    */

ifreq结构定义在/usr/include/net/if.h;用来配置ip地址,激活接口,配置MTU等接口信息的。

获取本机ip:

#include <string.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


void get_local_ip(char *g_localIP )
{
    int sock_get_ip;
    struct sockaddr_in *sin;
    struct ifreq ifr_ip;

    if ((sock_get_ip = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        //todo:
    }
    
    memset(&ifr_ip, 0, sizeof(ifr_ip));
    strncpy(ifr_ip.ifr_name, "eth0", sizeof(ifr_ip.ifr_name)-1);
    if (ioctl(sock_get_ip, SIOCGIFADDR, &ifr_ip) < 0) {
        //todo:
    }
    sin = (struct sockaddr_in*)&ifr_ip.ifr_addr;
    printf("host: %s\r\n", inet_ntoa(sin->sin_addr));
    strcpy(g_localIP, inet_ntoa(sin->sin_addr));
    close(sock_get_ip);
}

int main()
{
    char g_localIP[20]="";
    get_local_ip(g_localIP);
    printf("%s\r\n", g_localIP);
    return 0;
}

2. ioctl声明

int ioctl( int filedes, int request, ... )
网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示:
接口

SIOCGIFCONF

SIOCSIFADDR

SIOCGIFADDR

SIOCSIFBRDADDR

SIOCGIFBRDADDR

SIOCSIFNETMASK

SIOCGIFNETMASK

获取所有接口列表

设置接口地址

获取接口地址

设置广播地址

获取广播地址

设置子网掩码

获取子网掩码

Struct  ifconf

Struct  ifreq

Struct  ifreq

Struct  ifreq

Struct  ifreq

Struct  ifreq

Struct  ifreq




以上是关于Interface request structure used for socket ioctl's的主要内容,如果未能解决你的问题,请参考以下文章

Interface request structure used for socket ioctl's

Python_testAutoInterface_requests

requests.exceptions.SSLError: HTTPSConnectionPool报错解决方案

Python之requests错误Expecting value: line 1 column 1 (char 0)

单接口测试框架

ARC测试Salesforce Interface class