int ioctl(int d, int request, ...); 后续是否有参数根据第二个参数request的须要来决定。服务器
ioctl用于硬件设备I/O通道控制,控制命令与参数都与设备高度相关,一般也与系统高度相关。网络
int fcntl(int fd, int cmd, ... /* arg */ );后续是否有参数根据第二个参数cmd的须要来决定。这点二者相同。socket
操做控制的对象是: 文件描述符。函数
ioctl()是底层的系统调用(system call),因此跨平台特性很差。.net
而fcntl则是被封装的函数,各个OS都是支持的。调试
在网络socket中,他们做用大概类似。对象
例如均可以设置socket的是否容许非阻塞模式,不过设置方式上略有不一样:blog
int socketfd = .....;进程
fcntl(sockfd, F_SETFL,fcntl(sockfd, F_GETFL, 0) |O_NONBLOCK);ip
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 版权声明:本文为博主原创文章,转载请附上博文连接!