Linux - setsockopt, ioctl 实现

引用


一. 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)流系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值