【UNIX网络编程】第7章套接口选项

有很多方法获取和设置影响套接口的选项:

  • getsockoptsetsockopt 函数
  • fcntl函数 (file control)
  • ioctl函数 (io control)

1. getsockopt和setsockopt函数

  • level指定系统中解释选项的代码:通用套接口代码,或某个特定于协议的代码
  • getsockopt把已获得的选项当前值存放到*optval,其值为0时,表示相应选项被禁止,不为0时表示相应选项被开启。
int getsockopt(int sockfd, int level, int optname, 
	           void *optval, socklen_t *optlen);
// setsockopt从*optval中取得选项待设置的新值
int setsockopt(int sockfd, int level, int optname, 
	           const void *optval, socklen_t *optlen);

2. 检查所有套接口选项的main函数

int main(int argc, char const *argv[])
{
	int fd;
	socklen_t len;
	struct sock_opts *ptr;
	// 遍历sock_opts[]数组中的所有元素
	for (ptr = sock_opts; ptr->opt_str != NULL; ptr++)
	{
		printf("%s\n", ptr->opt_str);
		if (ptr->opt_val_str == NULL)
			printf("(undefined)\n");
		else
		{
			switch(ptr->opt_level)
			{
// 用于测试选项的套接口 
				case SOL_SOCKET:
				case IPPROTO_IP:
				case IPPROTO_TCP:
					fd = Socket(AF_INET, SOCK_STREAM, 0);
					break;
#ifdef IPV6
				case IPPROTO_IPV6:
					fd = Socket(AF_INET, SOCK_STREAM, 0);
					break;
#endif
#ifdef IPPROTO_SCTP
				case IPPROTO_SCTP:
					fd = Socket(AF_INET, SOCK_STREAM, 0);
					break;
#endif
				default:
					err_quit("Can't create fd for level %d\n", ptr->opt_level);
			}
			len = sizeof(val);
			if (getsockopt(fd, ptr->opt_level, ptr->opt_name, &val, &len) == -1)
			{
				err_ret("getsockopt error");
			} else {
				printf("default =%s\n", (*ptr->opt_val_str)(&val, len));
			}
			close(fd);
		}
	}
	exit(0);
	return 0;
}

static char strres[128];
static char * sock_str_flag(union val *ptr, int len)
{
	if (len != sizeof(int))
		snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
	else
		snprintf(strres, sizeof(strres), "%s", (ptr->i_val == 0) ? "off" : "on");
	return (strres);
}	

3. fcntl函数

fcntl(file control)函数可执行各种描述字控制操作。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值