int ioctl(int d, int request, ...); 后续是否有参数根据第二个参数request的需要来决定。

ioctl用于硬件设备I/O通道控制,控制命令与参数都与设备高度相关,通常也与系统高度相关。

int fcntl(int fd, int cmd, ... /* arg */ );后续是否有参数根据第二个参数cmd的需要来决定。这点两者相同。

操作控制的对象是: 文件描述符。

ioctl()是底层的系统调用(system call),所以跨平台特性不好。

而fcntl则是被封装的函数,各个OS都是支持的。

在网络socket中,他们作用大概相似。

例如都可以设置socket的是否允许非阻塞模式,不过设置方式上略有不同:

int socketfd = .....;

fcntl(sockfd, F_SETFL,fcntl(sockfd, F_GETFL, 0) |O_NONBLOCK);

ioctl(sockfd, FIONBIO,1);  1:非阻塞0:阻塞

int setsockopt(int sockfd, int level, int optname, void *optval,socklen_t *optlen);

设置套接字选项.只能操作套接字。

sockfd:    套接字

level:     协议层  SOL_SOCKET/IPPROTO_IP/IPPRO_TCP

optname:   选项名  每一个协议层都有其固定的选项名

optval:    缓冲区  set是指向将要存放的地址, get是指向目前存放信息的地址

optlen:    缓冲区大小长度

在socket层常用操作有:

SO_BROADCAST            允许发送广播数据                  int

SO_DEBUG        允许调试                int

SO_DONTROUTE      不查找路由               int

SO_ERROR        获得套接字错误             int

SO_KEEPALIVE      保持连接                int

SO_LINGER        延迟关闭连接              structlinger

SO_OOBINLINE      带外数据放入正常数据流         int

SO_RCVBUF        接收缓冲区大小             int

SO_SNDBUF        发送缓冲区大小             int

SO_RCVLOWAT       接收缓冲区下限             int

SO_SNDLOWAT       发送缓冲区下限             int

SO_RCVTIMEO       接收超时                structtimeval

SO_SNDTIMEO       发送超时                structtimeval

SO_REUSERADDR      允许重用本地地址和端口         int

SO_TYPE         获得套接字类型             int

SO_BSDCOMPAT      与BSD系统兼容              int

使用 SO_RECVBUF 和 SO_SENDBUF可以改变缺省缓冲区大小

例:

//设置接收缓冲区大小

intn_recvbuf = 32 * 1024;

setsockopt(sockfd, SOL_SOCKET,SO_RECVBUF, (const char*)&n_recvbuf,sizeof(int));

//设置发送缓冲区大小

intn_sendbuf = 32 * 1024;

setsockopt(sockfd, SOL_SOCKDET,SO_SENDBUF, (const char*)&n_sendbuf,sizeof(int));

使用SO_REUSERADDR:

1.当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程 序就要用到该选项。

2.SO_RESUERADDR允许同一port上启动同一服务器的多个实例(多个进程),但每个实例绑定的IP地址是不能相同的。

3.SO_RESUERADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。

4.SO_RESUERADDR允许完全相同的地址和端口的重复绑定,但这只用于UDP的多播,不用于TCP。

setsockopt()只是针对socket设置参数,是在连接中的参数控制,在OS层级的控制则由ioctl和fcntl控制。如果要是获取socket参数则使用getsockopt.

---------------------

作者:Richard__Lee

来源:CSDN

原文:https://blog.csdn.net/td_sexandzen/article/details/53785835

版权声明:本文为博主原创文章,转载请附上博文链接!

c语言 ioctl,ioctl() fcntl() setsockopt() ioctlsocket() 用法相关推荐

  1. Linux的ioctl和fcntl

    Linux的ioctl和fcntl 1. 一切都是文件 在Linux中一切设备都当作文件,也就是说一切设备都抽象成一个文件,能够提取出来一些共同的特征.文件的一些最常用的操作,如打开.读取.写入等,L ...

  2. python语言入门n-python语言入门之字符串的一些用法

    本篇教程探讨了python语言入门之字符串的一些用法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 一.字符串的拼接: a="123' b="ab ...

  3. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程

    本文实例讲述了C语言变量类型与输出控制用法,有助于读者很好的对其进行总结与归纳.该实例分享给大家供大家参考借鉴之用.具体如下: 完整实例代码如下: /************************* ...

  4. channelinactive触发后不关闭channel_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作...

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  5. java case用法_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作

    今天是golang专题第15篇文章,我们来继续聊聊channel的使用. 在我们的上篇文章当中我们简单介绍了golang当中channel的使用方法,channel是golang当中一个非常重要的设计 ...

  6. c语言数据类型int的用法,C语言基本数据类型:整型(int)用法详解|C语言学习

    C语言基本数据类型:整型(int)用法详解 1. 整型 int C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.以后, ...

  7. getsockopt/setsockopt函数用法【转】

    来自:https://blog.csdn.net/legendox/article/details/4595492 功能描述:         获取或者设置 与某个套接字关联的选 项.选项可能存在于多 ...

  8. 对C语言的关键字及部分关键字用法的简单理解

    小盆友,你是否有很多问号??? C语言的关键字是什么?有哪些?他们如何用??? 我也在学习中迷惑着,所以把今天学习到的稍微做一下总结,方便自己以后的复习(目前学到的比较粗浅,以后还需要深入学习). 哪 ...

  9. C语言,变长数组的用法

    ​ 在我的<C语言,结构体成员的地址>文章中,定义了一个demo_node结构体,其中用到变长数组char addr[0].本文以此为例,对C语言变长数组的基本用法展开介绍. #pragm ...

最新文章

  1. mysql-innodb 日志机制分析----写在死锁前面
  2. 数组拷贝问题的解决方法
  3. Android之自定义控件显示点赞用户并通过用户名称进入该用户主页的功能
  4. 计算机英语基础性考任务三,(2021更新)国家开放大学电大《计算机应用基础》形考任务3作业3试题及答案...
  5. 【LeetCode从零单排】No.8 String to Integer (丧心病狂的一道题)
  6. 6.Java中的变量(定义)和数据类型(划分)
  7. 我的2020(年终总结)
  8. java 盘符 系统_001-Java再回首开篇-入门基础
  9. java中的action是指什么_Struts2【开发Action】知识要点
  10. SSH 连接、远程上传下载文件
  11. Spring Cloud(Greenwich版)-03-编写高可用Eureka Server(集群)
  12. Ubuntu 下搭建 Android 开发环境(图文)
  13. WinForm转WPF
  14. Excel 哪个版本的好用?
  15. 按键精灵一个命令学会这么厉害
  16. 方舟手游机服务器修改,方舟生存进化私服怎么设置 方舟手游私服设置教程
  17. 手把手带你学习Odoo OWL组件开发(1):认识 OWL
  18. 10个全网最具创意的聊天机器人:漫威和联合国儿童基金会都在尝试使用聊天机器人
  19. clamped b_spline
  20. 科技感十足五款APP软件,让你的手机不再低调!

热门文章

  1. Android系统架构开篇(深度好文,值得收藏,kotlin线程安全
  2. m版本 android,chiccam手机版下载-chiccam安卓版下载v4.2 最新版-西西软件下载
  3. 串口调试助手读写三菱fx3u数据_用电脑通过串口(RS485)给三菱PLC(FX3U)发指令,怎样在梯形图里写接收串口数据的程序?...
  4. Matlab Robotics project 1 phase 1 <Experiment Recording>
  5. C#第七回:DialogResult
  6. js html转为图片格式,Js实现将html页面或div生成图片
  7. 医疗行业大数据分析有哪些应用
  8. 重新安装mac 自带的apachectl_AirMail 可能是Mac上最好用的邮箱客户端
  9. 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】 - 博客 - 伯乐在线...
  10. Android Stdio 控制STM32开发板