ioctl函数的参数介绍

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

IPv4 和 IPv6 的网络接口操作

使用套接字 ioctl 命令

developerWorks
文档选项
将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送


级别: 中级

Katiyar Manish (manish.katiyar@in.ibm.com), 软件工程师, IBM, Intel, Microsoft,HP
Shweta Gupta (shwetagupta@in.ibm.com), 高级软件工程师, IBM

2007 年 3 月 13 日

了解更多关于套接字 I/O 控制 (ioctl) 命令的内容,以及如何使用它们完成各种网络相关的操作.操作系统为套接字、路由表、ARP 表、全局网络参数和接口提供了相应的控制操作方式。本文适用于对 Internet Protocol Version 4 (IPv4) 和 Internet Protocol Version 6 (IPv6) 堆栈网络级操作感兴趣的 AIX® Version 5.3 开发人员。

引言

文件描述符是低层的输入和输出接口。描述符可以表示到设备、管道或套接字的连接,这些连接用于与另一个进程或普通文件进行通信。I/O 控制 (ioctl) 函数调用可以用来对特殊文件的基础设备参数进行操作。它们可以完成与打开的文件描述符相关联的控制功能。这些命令涉及文件、流、普通数据链路控制以及其他各种设备。

本文将讨论 AIX® Version 5.3 中提供的与网络操作和套接字相关的命令。在下列文件中列出了与套接字相关的命令和结构:

  • sys/ioctl.h
  • net/if_arp.h
  • net/if.h
  • net/netopt.h
  • netinet/in.h
应用程序开发人员可以使用这些命令,并且在 AIX Version 5.3 的文档中对这些命令进行了详细的描述。本文说明了有关 Internet Protocol Version 6 (IPv6) 地址和 Internet Protocol Version 4 (IPv4) 堆栈的常用命令的典型用法。

使用 ioctl 套接字控制选项

通常,网络程序需要了解系统中所有有关网络接口和 IP 地址的可用信息。现在,未来的应用程序可以支持 IPv4 和 IPv6 双协议栈。ioctl 结构需要对指针进行遍历和操作,以处理 IPv4 和 IPv6 地址在长度上的差别(除了使用合适的套接字结构 sockaddr_in6 或 sockaddr_storage 之外)。

AIX Version 5.3 提供了很多 ioctl 套接字控制选项,以提取各种有关网络接口的信息。这些 ioctl 命令用于查询接口的状态并对其属性进行操作。下面的部分中包含了一些有用的命令的代码段。有关 ioctl 命令的完整列表,请参见参考资料部分。

ioctl 命令所使用的结构

下面的清单介绍了一些最重要的结构,使用 ioctl 套接字命令时常常用到这些结构。


清单 1. struct ifreq (/usr/include/net/if.h)
				
/* 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 {
#ifndef IFNAMSIZ
#define IFNAMSIZ        16
#endif
        char    ifr_name[IFNAMSIZ]; 
        union {
                struct  sockaddr ifru_addr;
                struct  sockaddr ifru_dstaddr;
                struct  sockaddr ifru_broadaddr;
                __ulong32_t     ifru_flags;
                int     ifru_metric;
                caddr_t ifru_data;
                u_short ifru_site6;
                __ulong32_t   ifru_mtu;
                int     ifru_baudrate;
        } ifr_ifru;

Following macros are provided for convenience

#define ifr_addr        ifr_ifru.ifru_addr      /* address */
#define ifr_dstaddr     ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */
#define ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_flags       ifr_ifru.ifru_flags     /* flags */
#define ifr_metric      ifr_ifru.ifru_metric    /* metric */
#define ifr_data        ifr_ifru.ifru_data      /* for use by interface */
#define ifr_site6       ifr_ifru.ifru_site6     /* IPv6 site index */
#define ifr_mtu         ifr_ifru.ifru_mtu       /* mtu of interface */
#define ifr_isno        ifr_ifru.ifru_data      /* pointer to if_netopts */
#define ifr_baudrate    ifr_ifru.ifru_baudrate  /* baudrate of interface */
};
      


清单 2. struct ifconf (/usr/include/net/if.h)
				
/*
 * 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 associated buffer */
        union {
                caddr_t ifcu_buf;
                struct  ifreq *ifcu_req;
        } ifc_ifcu;

Following macros are provided for convenience

#define ifc_buf ifc_ifcu.ifcu_buf       /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req       /* array of structures returned */
};
      





回页首


代码示例

下面的表 1 介绍了一些接口检索命令。该信息来源于 IBM System p™ 和 AIX。


表 1. 接口检索命令
ioctl 命令描述
SIOCGSIZIFCONF获得获取 SIOCGIFCONF 返回的所有接口的配置信息所需的内存。
		
ioctl(fd, SIOCGSIZIFCONF, (caddr_t)&ifconfsize);
int ifconfsize;

SIOCGIFADDR

SIOCSIFADDR
SIOCGIFADDR 获取接口地址,而 SIOCSIFADDR 设置接口地址。ifr.ifr_addr 字段返回地址。
ioctl(fd, SIOCGIFADDR, (caddr_t)&ifr, sizeof(struct ifreq));
ioctl(fd, SIOCSIFADDR, (caddr_t)&ifr, sizeof(struct ifreq));
struct ifreq ifr;

SIOCGIFCONF返回系统中配置的所有接口的配置信息。
ioctl(fd, SIOCGIFCONF, (caddr_t)&ifc);
struct ifconf ifconf;

SIOCGSIZIFCONF

下面的代码段可以获取用来填充所有配置接口的信息所需的缓冲区大小。


清单 3. 使用 SIOCGSIZIFCONF 获得所需的缓冲区大小
				
/*Function to get the size needed to allocate for buffers*/
int get_interface_size(int sd){
    int ret,size;
    ret=ioctl(sd,SIOCGSIZIFCONF,&size);
    if(ret==-1){
       perror("Error getting size of interface :");
       return ret;
    }
    return size;
}

main
{
    struct ifconf ifc;
    int sd;
    sd=socket(AF_INET6,SOCK_DGRAM,0);
    printf("Size of memory needed = %d/n",get_interface_size(sd));
}
 
      

上面代码的输出是:

$> ./myprog
Size of memory needed = 628
      

SIOCGIFCONF 和 SIOCGIFADDR

SIOCGIFCONF 和 SIOCGIFADDR 命令可以用来检索接口的地址。SIOCGIFCONF 可以用来获取所有配置接口的信息,SIOCGIFADDR 可以用来检索特定接口的地址。


清单 4. 使用 SIOCGIFCONF 获取配置信息

					
/*This function uses loops to find out buffer size instead of SIOCGSIZIFCONF 
  allocates the buffer and gets the information list*/
int alloc_buffer_size(int sd,struct ifconf *ifc){
    int ret=-1,bsz=sizeof(struct ifreq);
    int prevsz=bsz;
    ifc->ifc_req=NULL;
    ifc->ifc_len=bsz;
    do{
       ifc->ifc_req=(struct ifreq *)realloc(ifc->ifc_req,bsz);
       if(!ifc->ifc_req){
         perror("Malloc failed :");
         return ret;
       }
       ifc->ifc_len=bsz;
       ret=ioctl(sd,SIOCGIFCONF,(caddr_t)ifc);
       if(ret==-1){
          perror("Error getting size of interface :");
          return ret;
       }
      if(prevsz==ifc->ifc_len)
        break;
      else{
         bsz*=2;
         prevsz=(0==ifc->ifc_len ? bsz : ifc->ifc_len) ;
      }
    }while(1);
    ifc->ifc_req=(struct ifreq *)realloc(ifc->ifc_req,prevsz);
    return ifc->ifc_len;
}

      

在使用 ifreq 结构中的配置信息填充了列表之后,可以对其进行遍历以检索所需的数据。根据调用之后该结构中填充的套接字地址的长度,可以对这个指针进行移动。下面的清单 5 显示了上面代码的列表中获得的系统中可用的 IP。


清单 5. 从配置列表中检索信息
					
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define SIZE(p) MAX((p).sa_len, sizeof(p))

/* This function prints all the configured IPs on the
 * system given the ifconf structure allocated previously*/
void print_ips(struct ifconf *ifc){
     char *cp,*cplim,addr[INET6_ADDRSTRLEN];
     struct ifreq *ifr=ifc->ifc_req;
     cp=(char *)ifc->ifc_req;
     cplim=cp+ifc->ifc_len;
     for(;cp<cplim;cp+=(sizeof(ifr->ifr_name) + SIZE(ifr->ifr_addr))){
        /* NOTE: You cannot just increment cp with sizeof(struct ifreq)
         * as structures returned are of different length.
         */
        ifr=(struct ifreq *)cp;
        printf("%s :",ifr->ifr_name);
        getip(ifr,addr);
        printf("%s/n",addr);
     }
      return ;
}
main
{
    struct ifconf ifc;
    int sd;
    sd=socket(AF_INET6,SOCK_DGRAM,0);
    alloc_buffer_size(sd,&ifc);
    print_ips(&ifc);
}
      

上面代码的输出是:

$> ./myprog
en0 :6.3.6.0
en0 :9.182.192.169
en0 :fe80::209:6bff:feeb:70b2
sit0 :1.4.4.0
sit0 :::9.182.192.169
lo0 :24.3.0.0
lo0 :127.0.0.1
lo0 :::1
      


清单 6. 使用 SIOCGIFADDR 获取接口地址
					
/* Given a ifreq structure this function returns its IP address */
void getip(struct ifreq *ifr,char *addr){
  struct sockaddr *sa;
  sa=(struct sockaddr *)&(ifr->ifr_addr);
  switch(sa->sa_family){
    case AF_INET6:
      inet_ntop(AF_INET6,(struct in6_addr *)&(((struct sockaddr_in6 *)sa)->sin6_addr),
         addr,INET6_ADDRSTRLEN);
      break;
    default : strcpy(addr,inet_ntoa(((struct sockaddr_in *)sa)->sin_addr));
    }
   return;
}

main
{
  char netaddr[INET_ADDRSTRLEN];
  int sd;
  sd=socket(AF_INET,SOCK_DGRAM,0);
  strcpy(ifr.ifr_name,"en0");
  if((ioctl(sd,SIOCGIFADDR,(caddr_t)&ifr,sizeof(struct ifreq)))<0)
     perror("Error : ");
  getip(&ifr,netaddr);
  printf("%s/n",netaddr);
}
      

上面代码的输出是:

$./myprog
9.182.192.35
      

下面的表 2 介绍了接口标志和一些属性检索命令。


表 2. 接口标志和属性检索命令
ioctl 命令描述
SIOCGIFFLAGS

SIOCSIFFLAGS
SIOCGIFFLAGS 可以获取接口标志。

SIOCSIFFLAGS 可以设置接口标志。

ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;

SIOCGIFFLAGS

在使用 SIOCGIFCONF 获取了接口列表之后,您可以使用 SIOCGIFFLAGS-SIOCSIFFLAGS 对来获取和设置接口的属性。接口标志表示为 IFF_XXX。有关完整的列表,请参阅文件 /usr/include/net/if.h。

下面的示例使用一对接口标志来检索其当前状态,并检查环回。也可以使用其他选项。


清单 7. 验证接口的状态和类型
				
   for(;cp<cplim;){
        ifr=(struct ifreq *)cp;
        cp+=(sizeof(ifr->ifr_name) + SIZE(ifr->ifr_addr));
        printf("%-9s  ",ifr->ifr_name);
        ret=ioctl(sd,SIOCGIFFLAGS,(caddr_t)ifr);
        if(ret==-1){
          perror("Error getting flags for interface :");
          return ;
        }
        if((ifr->ifr_flags)&IFF_UP)
           printf("UP");
        else printf("DOWN");
        if((ifr->ifr_flags)&IFF_LOOPBACK)
           printf(",Loopback");
	printf("/n");
     }
      

上面代码的输出是:

$> ./myprog
en0        UP
en0        UP
en0        UP
sit0       UP
sit0       UP
lo0        UP,Loopback
lo0        UP,Loopback
lo0        UP,Loopback
      


清单 8. 设置接口标志
				
	Partial output of ifconfig before setting the flag

sit0: flags=4900041<UP,RUNNING,LINK0,64BIT>
        inet6 ::9.182.192.169/96

Code to set the interface flag 

int set_interface_flag(int sd,short flag,char *interface){
    struct ifreq ifr;
    int oldflags;
    strcpy(ifr.ifr_name,interface);
    if((ioctl(sd,SIOCGIFFLAGS,(caddr_t)&ifr))==-1){
      perror("Error getting interface flags :");
      return -1;
    }
    printf("Setting new interface flag 0X%x/n",flag);
    ifr.ifr_flags|=flag;
    if((ioctl(sd,SIOCSIFFLAGS,(caddr_t)&ifr))==-1){
      perror("Error setting interface flags :");
      return -1;
    }
    return 0;
}

main
{
    int sd;
    sd=socket(AF_INET6,SOCK_DGRAM,0);
    set_interface_flag(sd,IFF_NOTRAILERS,"sit0");
}

上面代码的输出是:

You must have permission to change the flag

$./myprog
Setting new interface flag 0X20

$ifconfig -a
.............
.............
sit0: flags=4900061<UP,NOTRAILERS,RUNNING,LINK0,64BIT>
        inet6 ::9.182.192.169/96
.............
.............
      

表 3 介绍了一些用于网络优化的命令。


表 3. 用于网络优化的命令
ioctl 命令描述
SIOCGIFMTUSIOCGIFMTU 可以获取接口的最大传输单元 (MTU)。

ioctl(fd, cmd, (caddr_t)&ifr);
struct ifreq ifr;

这个 MTU 值存储在 ifr.ifr_mtu 字段中。

SIOCGNETOPT
SIOCGNETOPT1
SIOCGNETOPT 可以获取一个网络选项的值。

ioctl(fd, cmd, (caddr_t)&oreq);
struct optreq oreq;

SIOCGNETOPT1 可以获取当前值、缺省值和网络选项的范围。

ioctl(fd, SIOCGNETOPT1, (caddr_t)&oreq);
struct optreq1 oreq;

SIOCGIFMTU


清单 9. 从 ifreq 结构获取 MTU
				
        ret=ioctl(sd,SIOCGIFMTU,ifr);
        if(ret==-1){
          perror("Error getting mtu for interface :");
          return ;
        }
        printf("  %d/n",ifr->ifr_mtu);
      

SIOCGNETOPT1

SIOCGNETOPT1 给出当前值、缺省值和网络选项的范围。


清单 10. 从 optreq1 结构获取网络选项
				
/*Function to get the network options*/
int print_network_options(int sd){
    int ret;
    struct optreq1 oreq;
    oreq.getnext=1;
    while((ioctl(sd,SIOCGNETOPT1,(caddr_t)&oreq))!=-1)
    printf("%s = %s/n",oreq.name,oreq.data);
   return 0;
}
      

上面代码的输出是:

$> ./myprog
arpqsize = 12
arpt_killc = 20
arptab_bsiz = 7
arptab_nb = 149
........
........
........
........
ifsize = 256
inet_stack_size = 16
ip6_defttl = 64
........
      

在 AIX 中,您还可以使用 no 命令来管理各种网络优化参数。有关更详细的信息,请参阅相应的 man 页面。


清单 11. AIX 计算机上“no”命令的输出
				
$> no -a|more
               arpqsize = 12
               arpt_killc = 20
              arptab_bsiz = 7
                arptab_nb = 149
                bcastping = 0
      clean_partial_conns = 0
                 delayack = 0
            delayackports = {}
         dgd_packets_lost = 3
            dgd_ping_time = 5
           dgd_retry_time = 5
       directed_broadcast = 0
         extendednetstats = 0
                 fasttimo = 200
........
........
      





回页首


总结

ioctl 命令的功能非常强大,您可以使用它们来访问或修改网络(或其他)设备的可配置参数。它们使用了各种各样的数据结构,应该使用正确的数据来填充这些数据结构,以便实现预期的结果。您将发现在使用 AF_INET 和 AF_INET6 系列时存在的区别。本文提供了一小部分常用命令子集的代码示例。要获得 AIX Version 5.3 中完整的命令清单,请转到参考资料部分。我们希望这些关于 ioctl 的信息对您有用。

ioctl()函数详解 阅读详情

相关推荐

Linux ioctl函数详解及编程示例

接下来,我们使用ioctl函数发送GET_PARAM命令,获取设置后的参数值,并打印出来。综上所述,ioctl函数在Linux系统中是一个非常强大和灵活的函数,用于与设备驱动程序进行通信和控制。ioctl函数是Linux系统中一个非常有用的函数,用于与设备驱动程序进行通信和控制。需要注意的是,上述示例仅用于演示ioctl函数的基本用法,并假设设备文件已经存在且具有相应的驱动程序。在实际应用中,你需要根据具体的设备和驱动程序来定义请求编码和参数类型,并根据需要进行错误处理。可以是终端、文件或设备节点等。

ByteEchoX的博客 415

ipv6 address 的设定

记得看过一篇日志说ioctl无法实现ipv6地址的设定,今天没事研究了下,其实并非那位仁兄所说,算了,多的不说了,上代码(代码在ubuntu10.04上调试通过),当然这是个例子程序,欢迎大家拍砖来完善! #include #include #include #include #include #include #include #include #include

xiaoweibeibei的专栏 3927

ioctl函数的SIOCGIFFLAGS和SIOCSIFFLAG

其中,socket_fd是已打开的套接字文件描述符,ifr是ifreq结构体类型的变量,该结构体包含了要操作的网络接口的名称。如果该操作成功,ifr结构体中的if_flags成员将包含接口的标志。是ifreq结构体类型的变量,该结构体包含了要操作的网络接口的名称和要设置的标志。如果该操作成功,接口的标志将被设置为if_flags成员中指定的值。S是指socket,IO是指input/output,CG是指get,CS是指set,IFFLAGS是指interface flags,因此。

qq_45572853的博客 4523

SIOCGIFFLAGS, SIOCSIFFLAGS

SIOCGIFFLAGS, SIOCSIFFLAGS 读取 或 设置 设备的 活动标志字. ifr_flags 包含 下列值 的 屏蔽位: 设备标志 IFF_UP 接口正在运行. IFF_BROADCAST 有效的广播地址集. IFF_DEBUG 内部调试标志. IFF_LOOPBACK 这是自环接口. IFF_POIN

eager7的专栏 2万+

linux 驱动——高级字符驱动程序操作

内容ioctlioctl 的系统概念 与用户空间同步的方法 进程休眠 非阻塞IO及与用户间的通信 原型函数int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);一、ioctl 命令ioctl 的命令由四部分组成通过ioctl()函数的cmd,下发需要底层响应的命令。c

qq_22340085的博客 987

ioctl函数介绍

我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl, 所以就规定了我们讨论的范围。为什么要写篇文章呢,是因为我前一阵子被ioctl给搞混 了,这几天才弄明白它,于是在这里清理一下头脑。 一、 什么是ioctlioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就

Humwen 6186

ioctl函数

一、什么是ioctl   ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。   ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。   用户程序所作的只是通过命令码(cmd)告诉驱动程序它想...

qq_42655404的博客 1万+

ioctl函数参数

ioctl函数参数   2009-11-26 10:44:51|  分类: 工作|举报|字号 订阅        网络程序(一般是服务器程序)中ioctl常用于在程序启动时获得主机上所有接口的信息:接口的地址、接口是否支持广播、是否支持多播等等。 #include    or #include int ioctl(int fd,

lin364812726的专栏 2404

linux系统调用之 ioctl 函数介绍

1. ioctl为什么会出现 虽然在文件操作结构体 “struct file_operations” 中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数。如CD-ROM的驱动,想要一个弹出光驱的操作,这种操作并不是所有的字符设备都需要的,所以文件操作结构体也不会有对应的函数操作。 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力,用户程序所作的只是通过...

w741627265的博客 1900

linux内核中ioctl函数与write,read函数的区别

ioctl函数在Linux内核中的原型如下:: 要进行ioctl操作的文件描述符,通常是设备文件打开返回的值。: ioctl命令编码,用来指定具体的ioctl操作。它是一个常量,定义在内核头文件里。: 根据request不同可能有其他出入参数:*无参数请求,此处为空。*有一个参数请求,此处传一个指针。*有两个以上参数请求,此处传一个void*指针来接收结构体参数

weixin_44555799的博客 2117

linux 驱动 ioctl 长度,【linux驱动分析】ioctl函数的使用

一、用户空间的ioctlint ioctl(int fd, unsigned long cmd, void *data);第一个參数是文件描写叙述符,第二个參数代表传递的命令,它会原样传递给驱动,第三个參数是可选类型的,主要依据第二个參数选择,第三个參数不管是整数还是指针,都会以unsigned long的形式传递给驱动程序。二、内核空间的ioctl1、參数的定义long (*unlocked_...

weixin_42628941的博客 351

linux 内核 - ioctl 函数详解

概念 ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。 在文件 I/O 中,ioctl 扮演着重要角色,本文将以驱动开发为侧重点,从用户空间到内核空间纵向分析 ioctl 函数。 用户空间 ioctl #include <sys/ioctl.h> int ioctl(int fd, int cmd, …) ; 参数 描述 fd 文件描述符 cm.

weixin_40237571的博客 692

linux ioctl()详解

一、ioctl的简介: 虽然在文件操作结构体"struct file_operations"中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数。如CD-ROM的驱动,想要一个弹出光驱的操作,这种操作并不是所有的字符设备都需要的,所以文件操作结构体也不会有对应的函数操作。 出于这样的原因,ioctl就有它的用处了————一些没办法归类的函数就统一放在ioctl

coolwriter的博客 11万+

ioctl()函数

函数影响由fd参数引用的一个打开的文件。 #include#include int ioctl( int fd, int request, .../* void *arg */ );返回0:成功    -1:出错 第三个参数总是一个指针,但指针的类型依赖于request参数。我们可以把和网络相关的请求划分为6类:套接口操作文件操作接口操作ARP高速

hecant的专栏 4485

ioctl函数详细说明

ioctl 函数   本函数影响由fd 参数引用的一个打开的文件。   #include int ioctl( int fd, int request, .../* void *arg */ ); 返回0 :成功    -1 :出错

hit_kongquan的专栏 751

linux驱动file_operations结构体的ioctl函数

最近太忙了,一直没有更新博客,虽然是个搬运工,但是写博客是督促自己学习的一个过程,当然了也希望能够帮助到更多的人。话不多说了下面讲一下file_operations结构体的ioctl函数的坑。顺便写file_operations结构体的ioctl函数的一些分析。 ...

目前从事linux驱动开发,多交流多学习吧 1160

ioctl函数详解(参数详解,驱动unlocked_ioctl使用、命令码如何封装)

@ioctl函数详解 一、ioctl函数的原型 在用户空间的函数原型 #include <sys/ioctl.h> int ioctl(int d, int request, ...); //io的控制,设备的控制 /***第一个参数d是打开的文件描述符***/ /***The second argument is a device-dependent request code,An ioctl() request has encoded in it whether t

weixin_39035140的博客 1万+

ioctl参数详解

ioctl函数 本函数影响由fd参数引用的一个打开的文件。 #includeint ioctl( int fd, int request, .../* void *arg */ );返回0:成功    -1:出错 第三个参数总是一个指针,但指针的类型依赖于request参数。我们可以把和网络相关的请求划分为6类:套接口操作文件操作接口操作ARP高

magicminglee's Blog 8504
下一篇: getche()和getch的区别
weixiuc
博客等级 码龄18年 31粉丝 60原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值