linux下getsockopt和setsockopt具体解释及測试

linux下getsockopt和setsockopt具体解释及測试

NAME

名字

getsockopt, setsockopt - get and set options on sockets

获取或者设置套接字的选项

SYNOPSIS

函数原型

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int getsockopt(int sockfd, int level, int optname,
                      void *optval, socklen_t *optlen);
       int setsockopt(int sockfd, int level, int optname,
                      const void *optval, socklen_t optlen);

參数:

sock:将要被设置或者获取选项的套接字。

level:选项所在的协议层。

optname:须要訪问的选项名。

optval:对于getsockopt(),指向返回选项值的缓冲。

对于setsockopt(),指向包括新选项值的缓冲。

optlen:对于getsockopt(),作为入口參数时,选项值的最大长度。作为出口參数时,选项值的实际长度。

对于setsockopt(),The size, in bytes, of the optval buffer.

level指定控制套接字的层次.能够取三种值:

1)SOL_SOCKET:通用套接字选项.

2)IPPROTO_IP:IP选项.

3)IPPROTO_TCP:TCP选项. 

RETURN VALUE

返回值

On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.

错误返回

ERRORS
       EBADF     The argument sockfd is not a valid descriptor.

       EFAULT    The  address  pointed  to  by optval is not in a valid part of the process address space.  For getsockopt(), this error may
                 also be returned if optlen is not in a valid part of the process address space.//

       EINVAL    optlen invalid in setsockopt().  In some cases this error can also occur for an invalid value  in  optval  (e.g.,  for  the
                 IP_ADD_MEMBERSHIP option described in ip(7)).

       ENOPROTOOPT
                 The option is unknown at the level indicated.

       ENOTSOCK  The argument sockfd is a file, not a socket.

EBADF:sock不是有效的文件描写叙述词

EFAULT:optval指向的内存并不是有效的进程空间

EINVAL:在调用setsockopt()时,optlen无效

ENOPROTOOPT:指定的协议层不能识别选项

ENOTSOCK:sock描写叙述的不是套接字

套接字选项和IP层的套接字选项汇总见《unix网络编程第三版卷一》P151图7-1

以下用一段小代码来检查选项是否受支持并获取默认值:

[email protected]:/myworkspace/unixnetwork/unpv13e/sockopt# cat -n checkopts.c
     1	/* include checkopts1 */
     2	/* *INDENT-OFF* */
     3	#include	"unp.h"
     4	#include	<netinet/tcp.h>		/* for TCP_xxx defines */
     5
     6	union val {
     7	  int				i_val;
     8	  long				l_val;
     9	  struct linger		linger_val;
    10	  struct timeval	timeval_val;
    11	} val;
    12
    13	static char	*sock_str_flag(union val *, int);
    14	static char	*sock_str_int(union val *, int);
    15	static char	*sock_str_linger(union val *, int);
    16	static char	*sock_str_timeval(union val *, int);
    17
    18	struct sock_opts {
    19	  const char	   *opt_str;
    20	  int		opt_level;
    21	  int		opt_name;
    22	  char   *(*opt_val_str)(union val *, int);
    23	} sock_opts[] = {
    24		{ "SO_BROADCAST",		SOL_SOCKET,	SO_BROADCAST,	sock_str_flag },
    25		{ "SO_DEBUG",			SOL_SOCKET,	SO_DEBUG,		sock_str_flag },
    26		{ "SO_DONTROUTE",		SOL_SOCKET,	SO_DONTROUTE,	sock_str_flag },
    27		{ "SO_ERROR",			SOL_SOCKET,	SO_ERROR,		sock_str_int },
    28		{ "SO_KEEPALIVE",		SOL_SOCKET,	SO_KEEPALIVE,	sock_str_flag },
    29		{ "SO_LINGER",			SOL_SOCKET,	SO_LINGER,		sock_str_linger },
    30		{ "SO_OOBINLINE",		SOL_SOCKET,	SO_OOBINLINE,	sock_str_flag },
    31		{ "SO_RCVBUF",			SOL_SOCKET,	SO_RCVBUF,		sock_str_int },
    32		{ "SO_SNDBUF",			SOL_SOCKET,	SO_SNDBUF,		sock_str_int },
    33		{ "SO_RCVLOWAT",		SOL_SOCKET,	SO_RCVLOWAT,	sock_str_int },
    34		{ "SO_SNDLOWAT",		SOL_SOCKET,	SO_SNDLOWAT,	sock_str_int },
    35		{ "SO_RCVTIMEO",		SOL_SOCKET,	SO_RCVTIMEO,	sock_str_timeval },
    36		{ "SO_SNDTIMEO",		SOL_SOCKET,	SO_SNDTIMEO,	sock_str_timeval },
    37		{ "SO_REUSEADDR",		SOL_SOCKET,	SO_REUSEADDR,	sock_str_flag },
    38	#ifdef	SO_REUSEPORT
    39		{ "SO_REUSEPORT",		SOL_SOCKET,	SO_REUSEPORT,	sock_str_flag },
    40	#else
    41		{ "SO_REUSEPORT",		0,			0,				NULL },
    42	#endif
    43		{ "SO_TYPE",			SOL_SOCKET,	SO_TYPE,		sock_str_int },
    44	//	{ "SO_USELOOPBACK",		SOL_SOCKET,	SO_USELOOPBACK,	sock_str_flag },
    45		{ "IP_TOS",				IPPROTO_IP,	IP_TOS,			sock_str_int },
    46		{ "IP_TTL",				IPPROTO_IP,	IP_TTL,			sock_str_int },
    47	#ifdef	IPV6_DONTFRAG
    48		{ "IPV6_DONTFRAG",		IPPROTO_IPV6,IPV6_DONTFRAG,	sock_str_flag },
    49	#else
    50		{ "IPV6_DONTFRAG",		0,			0,				NULL },
    51	#endif
    52	#ifdef	IPV6_UNICAST_HOPS
    53		{ "IPV6_UNICAST_HOPS",	IPPROTO_IPV6,IPV6_UNICAST_HOPS,sock_str_int },
    54	#else
    55		{ "IPV6_UNICAST_HOPS",	0,			0,				NULL },
    56	#endif
    57	#ifdef	IPV6_V6ONLY
    58		{ "IPV6_V6ONLY",		IPPROTO_IPV6,IPV6_V6ONLY,	sock_str_flag },
    59	#else
    60		{ "IPV6_V6ONLY",		0,			0,				NULL },
    61	#endif
    62		{ "TCP_MAXSEG",			IPPROTO_TCP,TCP_MAXSEG,		sock_str_int },
    63		{ "TCP_NODELAY",		IPPROTO_TCP,TCP_NODELAY,	sock_str_flag },
    64	#ifdef	SCTP_AUTOCLOSE
    65		{ "SCTP_AUTOCLOSE",		IPPROTO_SCTP,SCTP_AUTOCLOSE,sock_str_int },
    66	#else
    67		{ "SCTP_AUTOCLOSE",		0,			0,				NULL },
    68	#endif
    69	#ifdef	SCTP_MAXBURST
    70		{ "SCTP_MAXBURST",		IPPROTO_SCTP,SCTP_MAXBURST,	sock_str_int },
    71	#else
    72		{ "SCTP_MAXBURST",		0,			0,				NULL },
    73	#endif
    74	#ifdef	SCTP_MAXSEG
    75		{ "SCTP_MAXSEG",		IPPROTO_SCTP,SCTP_MAXSEG,	sock_str_int },
    76	#else
    77		{ "SCTP_MAXSEG",		0,			0,				NULL },
    78	#endif
    79	#ifdef	SCTP_NODELAY
    80		{ "SCTP_NODELAY",		IPPROTO_SCTP,SCTP_NODELAY,	sock_str_flag },
    81	#else
    82		{ "SCTP_NODELAY",		0,			0,				NULL },
    83	#endif
    84		{ NULL,					0,			0,				NULL }
    85	};
    86	/* *INDENT-ON* */
    87	/* end checkopts1 */
    88
    89	/* include checkopts2 */
    90	int
    91	main(int argc, char **argv)
    92	{
    93		int					fd;
    94		socklen_t			len;
    95		struct sock_opts	*ptr;
    96
    97		for (ptr = sock_opts; ptr->opt_str != NULL; ptr++) {
    98			printf("%s: ", ptr->opt_str);
    99			if (ptr->opt_val_str == NULL)
   100				printf("(undefined)\n");
   101			else {
   102				switch(ptr->opt_level) {
   103				case SOL_SOCKET:
   104				case IPPROTO_IP:
   105				case IPPROTO_TCP:
   106					fd = Socket(AF_INET, SOCK_STREAM, 0);
   107					break;
   108	#ifdef	IPV6
   109				case IPPROTO_IPV6:
   110					fd = Socket(AF_INET6, SOCK_STREAM, 0);
   111					break;
   112	#endif
   113	#ifdef	IPPROTO_SCTP
   114				case IPPROTO_SCTP:
   115					fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
   116					break;
   117	#endif
   118				default:
   119					err_quit("Can‘t create fd for level %d\n", ptr->opt_level);
   120				}
   121
   122				len = sizeof(val);
   123				if (getsockopt(fd, ptr->opt_level, ptr->opt_name,
   124							   &val, &len) == -1) {
   125					err_ret("getsockopt error");
   126				} else {
   127					printf("default = %s\n", (*ptr->opt_val_str)(&val, len));
   128				}
   129				close(fd);
   130			}
   131		}
   132		exit(0);
   133	}
   134	/* end checkopts2 */
   135
   136	/* include checkopts3 */
   137	static char	strres[128];
   138
   139	static char	*
   140	sock_str_flag(union val *ptr, int len)
   141	{
   142	/* *INDENT-OFF* */
   143		if (len != sizeof(int))
   144			snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
   145		else
   146			snprintf(strres, sizeof(strres),
   147					 "%s", (ptr->i_val == 0) ? "off" : "on");
   148		return(strres);
   149	/* *INDENT-ON* */
   150	}
   151	/* end checkopts3 */
   152
   153	static char	*
   154	sock_str_int(union val *ptr, int len)
   155	{
   156		if (len != sizeof(int))
   157			snprintf(strres, sizeof(strres), "size (%d) not sizeof(int)", len);
   158		else
   159			snprintf(strres, sizeof(strres), "%d", ptr->i_val);
   160		return(strres);
   161	}
   162
   163	static char	*
   164	sock_str_linger(union val *ptr, int len)
   165	{
   166		struct linger	*lptr = &ptr->linger_val;
   167
   168		if (len != sizeof(struct linger))
   169			snprintf(strres, sizeof(strres),
   170					 "size (%d) not sizeof(struct linger)", len);
   171		else
   172			snprintf(strres, sizeof(strres), "l_onoff = %d, l_linger = %d",
   173					 lptr->l_onoff, lptr->l_linger);
   174		return(strres);
   175	}
   176
   177	static char	*
   178	sock_str_timeval(union val *ptr, int len)
   179	{
   180		struct timeval	*tvptr = &ptr->timeval_val;
   181
   182		if (len != sizeof(struct timeval))
   183			snprintf(strres, sizeof(strres),
   184					 "size (%d) not sizeof(struct timeval)", len);
   185		else
   186			snprintf(strres, sizeof(strres), "%d sec, %d usec",
   187					 tvptr->tv_sec, tvptr->tv_usec);
   188		return(strres);
   189	}
[email protected]:/myworkspace/unixnetwork/unpv13e/sockopt# man getsockopt

測试执行结果如图:

參考:UNIX网络编程卷一

Linux Programmer‘s Manual

时间: 2024-10-16 10:03:38

linux下getsockopt和setsockopt具体解释及測试的相关文章

linux下getsockopt和setsockopt详解及测试

NAME 名字 getsockopt, setsockopt - get and set options on sockets 获取或者设置套接字的选项 SYNOPSIS 函数原型 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int

Linux下图形界面调试工具kdbg安装及測试

1.Ubuntu系统下安装 Ubuntu系统安装比較方便,直接apt-get即可 apt-get install kdbg 2.centos 安装 首先,在这个地址下下载rpm包.然后使用rpm命令安装 http://pkgs.org/centos-5/centos-x86_64/kdbg-2.0.2-1.2.1.x86_64.rpm.html yum install  XXX 然后在http://en.wikipedia.org/wiki/KDbg下载最新的源码.进行编译

Linux下getsockopt/setsockopt 函数说明

[ getsockopt/setsockopt系统调用 功能描述:  获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET.为了操作其它层的选项,控制选项的合适协议号必须给出.例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP. 用法:  #include #include int getsockopt(int sock

linux下用户管理命令详细解释

1.useradd,增加用户命令 格式:useradd [选项] 用户名 选项:-u 表示UID 举例说明: useradd -u 888 user11 -g 表示GID 举例说明: useradd -g mysql user12 -G 表示GID,GID,GID,...额外组即用户可以属于其他多个组 举例说明: useradd -G mysql user13 -d 表示用户家目录路径 举例说明: useradd -d /home/willow user14 -s 表示用户登入后的正常的shel

linux下进程管理之常用解释

1.init: 进程号为1,为所有进程的主进程 2.ps命令:查看进程状态命令,静态进程状态 a: 所有与终端有关的进程 u: 按用户名显示的详细信息 x: 所有与终端无关的进程 -e:所有进程 -l:长格式显示 -f:完整输出 -o:自定义格式输出 常用命令: ps aux  显示所有进程并详细显示 ps aux | grep httpd  筛选出httpd进程相关信息 ps -elf 显示所有进程并详细显示 ps -ef  显示所有进程并详细显示 ps -axo user,pid,comm,

Linux下TCP延迟确认(Delayed Ack)机制导致的时延问题分析

版权声明:本文由潘安群原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/105 来源:腾云阁 https://www.qcloud.com/community 案例一:同事随手写个压力测试程序,其实现逻辑为:每秒钟先连续发N个132字节的包,然后连续收N个由后台服务回显回来的132字节包.其代码简化如下: char sndBuf[132]; char rcvBuf[132]; while (1) { for (int i

Linux下TCP延迟重庆时 时 彩源码下载确认(Delayed Ack)机制导致的时延问题分析

重庆时 时 彩下载联系方式:QQ:2747044651 网址在实际测试中发现,当N大于等于3的情况,第2秒之后,每次第三个recv调用,总会阻塞40毫秒左右,但在分析Server端日志时,发现所有请求在Server端处理时耗均在2ms以下. 当时的具体定位过程如下:先试图用strace跟踪客户端进程,但奇怪的是:一旦strace attach上进程,所有收发又都正常,不会有阻塞现象,一旦退出strace,问题重现.经同事提醒,很可能是strace改变了程序或系统的某些东西(这个问题现在也还没搞清

Linux下tomcat服务

一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/local/tomcat/bin)1,启动tomcat服务方式一:直接启动 ./startup.sh方式二:作为服务启动 nohup ./startup.sh &方式三:控制台动态输出方式启动 ./catalina.sh run 动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务解释:

linux下tomcat服务器的相关命令

一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/local/tomcat/bin)1,启动tomcat服务方式一:直接启动 ./startup.sh方式二:作为服务启动 nohup ./startup.sh &方式三:控制台动态输出方式启动 ./catalina.sh run 动态地显示tomcat后台的控制台输出信息,Ctrl+C后退出并关闭服务解释: