TCP/IP编程之getsockopt/setsockopt函数详解


前述:

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

· getsockoptsetsockopt函数

· fcntl函数,是把套接字设置为非阻塞式I/O型或者信号驱动式I/O型以及设置套接字属主的POSIX的方式

· ioctl函数

这篇文章只讨论getsockoptsetsockopt函数


函数原型:

GETSOCKOPT(2)              Linux Programmer's Manual             GETSOCKOPT(2)

NAME
       getsockopt, setsockopt - get and set options on sockets

SYNOPSIS
       #include           /* See NOTES */
       #include 

       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);

返回值:

若成功返回0,若出错返回-1


参数说明(以下文字务必细看):

其中sockfd必须指向一个打开的套接字描述符,level(级别)指定系统中解析选项的代码或为通用套接字代码,或为某个特定于协议的代码(例如IPv4、IPv6、TCP或SCTP)


optval是一个指向某个变量(*optval)的指针,setsockopt从*optval中取得选项代设置的新值,getsockopt则把已获取的选项当前值存放到*optval中。*optval的大小由最后一个参数指定。


下面两个图汇总了TCP编程中常用的可由getsockopt获取或者setsockopt设置的选项。其中的"数据类型"列给出了指针optval必须指向的每个选项的数据类型。我们用后跟一对花括号的记法来表示一个结构,如linger{}表示struct linger。

TCP/IP编程之getsockopt/setsockopt函数详解_第1张图片



套接字的选项粗分为两大基本类型:

一是启用或禁止某个特性的二元选项(称为标志选项)。

二是取得并返回我们可以设置或检查的特定值的选项(称为值选项)。

上图中标有"标志"的列指出一个选项是否为标志选项。当给这些标志选项调用getsokopt函数时,*optval是一个整数,*optval中返回的值为0表示相应选项被禁止,不为0表示选项被启用。类似地,setsockopt函数需要一个不为0的*optval值来启用选项,一个为0的*optval值来禁止选项。如果上图中“标志”列不含有“·”,那么相应选项用于在用户进程和系统之间传递所指定数据类型的值。


伪代码,禁用Nagle算法:

sockfd = socket(AF_INET, SOCK_STREAM, 0);
flag = 1;   
int ret = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag));
if (ret == -1) {   
    printf("Couldn't setsockopt(TCP_NODELAY)\n");   
}


ps:有兴趣的同学,应该把《unix网络编程》·卷1·第七章细看,此文只是摘录了部分内容,并没有对optname的选项做细致的讲解分析。


参考:《unix网络编程》·卷1

你可能感兴趣的:(TCP/IP)