引用
一. setsockopt
1.1 应用层接口
/*
* sockfd: 指向一个打开的套接字描述符。
* level: 选项定义的层次,例如,SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
* optname: 需设置的选项。
* optval: 指向存放选项待设置的新值的缓冲区。
* optlen: optval缓冲区长度。
*/
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
#include <unistd.h>
#include <fcntl.h>
fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL) | O_NONBLOCK));
ioctl(sockfd, FIONBIO, 1); //1表示非阻塞,0表示阻塞
1.2 内核实现(linux-5.0)
1.3 选项
二. ioctl
2.1 应用层接口
#include <unistd.h>
int ioctl(int fd, ind request, …);
#include <sys/types.h>
#include <sys/socket.h>
int main_client() {
int sockfd = socket():
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 0; //设置超时时间
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(timeout));
ret = connect(sockfd, &serveraddr, sizeof(servaddr));
if(ret == -1) {
if(errno == EINPROGRESS) { //connect超时返回-1,并设置errno为EINPROGRESS
printf("connect timeout\n");
}
return -1;
}
}
2.2 内核实现(linux-5.0)
sock_ioctl()是套接字类型文件的ioctl接口实现。首先根据不同层次或类型调用相应的处理函数,然后,通过套接字传输层接口进入到不同类型的套接字的实现中。STREAM, DGRAM, RAW类型的套接字都是inet_ioctl()。
inet_ioctl()是IPv4协议族套接字层ioctl接口的实现函数。根据不同的层次(如,路由,ARP, 网络设备)调用相应的处理函数,而其他情况则通过传输层接口进入到不同的传输层中实现。
- ip_rt_ioctl()用于处理添加和删除路由等。
- arp_ioctl()用于创建,修改,获取或删除ARP表项。
- dev_ioctl()用于修改或配置网络设备相关属性的,每个设备都可以定义自己的ioctl命令字,范围在 SIOCDEVPRIVATE - (SIOCDEVPRIVATE + 15)之间。
2.3 选项
* 把和网络相关的请求request划分为下面 6 类: * (1)套接字操作 * (2)文件操作 * (3)接口操作 * (4)ARP快速缓存操作 * (5)路由表操作 * (6)流系统