取得套接字选项

getsopts.c

/*============================================================================   
 Name        : getsopts.c 
 Author      : Haier   
 Version     : 1.01   
 Copyright   : Copyright (c) 2014   
 Description : getsopts in C, Compile by Gcc   
 ============================================================================*/ 
#include <netinet/tcp.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>

typedef union optval
{
	int				val;
	struct linger	linger;
	struct timeval	tv;
	unsigned char 	str[16];
}val;

typedef enum valtype
{
	VALINT,
	VALLINGER,
	VALTIMEVAL,
	VALUCHAR,
	VALMAX
}valtype;

typedef struct sopts
{
	int level;
	int optname;
	char *name;
	valtype valtype;
}sopts;

static val optval;
sopts sockopts[] = 
{
	{SOL_SOCKET, SO_BROADCAST, "SO_BROADCAST", VALINT},
	{SOL_SOCKET, SO_DEBUG,	   "SO_DEBUG",     VALINT},
	{SOL_SOCKET, SO_DONTROUTE, "SO_DONTROUTE", VALINT},
	{SOL_SOCKET, SO_ERROR,	   "SO_ERROR",	   VALINT},
	{SOL_SOCKET, SO_KEEPALIVE, "SO_KEEPALIVE", VALINT},
	{SOL_SOCKET, SO_LINGER,	   "SO_LINGER",	   VALINT},
	{SOL_SOCKET, SO_OOBINLINE, "SO_OOBINLINE", VALINT},
	{SOL_SOCKET, SO_RCVBUF,	   "SO_RCVBUF",    VALINT},
	{SOL_SOCKET, SO_RCVLOWAT,  "SO_RCVLOWAT",  VALINT},
	{SOL_SOCKET, SO_RCVTIMEO,  "SO_RCVTIMEO",  VALTIMEVAL},
	{SOL_SOCKET, SO_SNDTIMEO,  "SO_SNDTIMEO",  VALTIMEVAL},
	{SOL_SOCKET, SO_TYPE, 	   "SO_TYPE",	   VALINT},
	{IPPROTO_IP, IP_HDRINCL ,  "IP_HDRINCL",   VALINT},
	{IPPROTO_IP, IP_OPTIONS,   "IP_OPTIONS",   VALINT},
	{IPPROTO_IP, IP_TOS,	   "IP_TOS",	   VALINT},
	{IPPROTO_IP, IP_TTL,	   "IP_TTL",	   VALINT},
	{IPPROTO_IP, IP_MULTICAST_TTL, "IP_MULTICAST_TTL", VALUCHAR},
	{IPPROTO_IP, IP_MULTICAST_LOOP,"IP_MULTICAST_LOOP",VALUCHAR},
	{IPPROTO_TCP,TCP_KEEPCNT,  "TCP_KEEPCNT",  VALINT},
	{IPPROTO_TCP,TCP_MAXSEG,   "TCP_MAXSEG",   VALINT},
	{IPPROTO_TCP,TCP_NODELAY,  "TCP_NODELAY",  VALINT},
	{0,			 0,			   NULL,		   VALMAX}
};

/*-------------------------------------------------------------------
; 函数:display()
---------------------------------------------------------------------*/
static void display(sopts *sockopt, int len)
{
	switch(sockopt->valtype)
	{
		case VALINT:
		{
			printf("optname %s: default is %d\n", sockopt->name, optval.val);
			break;
		}
		case VALLINGER:
		{
			printf("optname %s: default is %d\t%d to linger\n", sockopt->name, optval.linger.l_onoff, optval.linger.l_linger);
			break;
		}
		case VALTIMEVAL:
		{
			printf("optname %s: default is %.06f\n", sockopt->name, ((((double)optval.tv.tv_sec * 100000 + (double)optval.tv.tv_usec))/(double)1000000));
			break;
		}
		case VALUCHAR:
		{
			int i = 0;
			printf("optname %s: default is ", sockopt->name);
			
			for(i=0; i<len; i++)
			{
				printf("%02x ", optval.str[i]);
			}
			
			printf("\n");
			break;
		}
		default:
		{
			break;
		}
	}
}

/*-------------------------------------------------------------------
; 函数:main()
---------------------------------------------------------------------*/
int main(int argc, char *argv[])
{
	int err = -1;
	socklen_t len = 0;
	int i = 0;
	int fd = socket(AF_INET, SOCK_STREAM, 0);
	
	while(sockopts[i++].valtype != VALMAX)
	{
		len = sizeof(sopts);
		
		err = getsockopt(fd, sockopts->level, sockopts->optname, &optval, &len);
		if(err > -1)
		{
			display(&sockopts[i], len);
		}
		
	}
	
	close(fd);
	return 0;
}

运行示例:

[Lenovo@Linux Ping]$ ./sopts_get.o 
optname SO_BROADCAST: default is 0
optname SO_DEBUG: default is 0
optname SO_DONTROUTE: default is 0
optname SO_ERROR: default is 0
optname SO_KEEPALIVE: default is 0
optname SO_LINGER: default is 0
optname SO_OOBINLINE: default is 0
optname SO_RCVBUF: default is 0
optname SO_RCVLOWAT: default is 0
optname SO_RCVTIMEO: default is 0.000000
optname SO_SNDTIMEO: default is 0.000000
optname SO_TYPE: default is 0
optname IP_HDRINCL: default is 0
optname IP_OPTIONS: default is 0
optname IP_TOS: default is 0
optname IP_TTL: default is 0
optname IP_MULTICAST_TTL: default is 00 00 00 00 
optname IP_MULTICAST_LOOP: default is 00 00 00 00 
optname TCP_KEEPCNT: default is 0
optname TCP_MAXSEG: default is 0
optname TCP_NODELAY: default is 0


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值