在Unix网络编程中,有非常多的套接口选项(虽然其中大多数并不常见),如下表所示:
套接口层和IP层的套接口选项汇总:
传输层的套接口选项汇总:
套接口选项分为两大基本类型:一是开启或禁止某个特性的二元选项(称为标志选项),二是取得并返回我们可以设置或检查的特定值的选项(称为值选项)。在标志栏下有“ √ ”,说明这是一个标志选项,用于开启或关系某个功能;当这些标志选项调用getsockopt函数时,*optval是一个整数。*optval中返回值为0表示相应选项被禁止,不为0表示相应选项被开启。而setsockopt则通过不为0的*optval值来开启某个功能,一个为0的*optval值来关闭某个功能。
下面介绍两个跟选项有关的函数:
#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);
参数说明:
sockfd:指向一个打开的套接口描述字(该套接口必须打开)
level:指定系统中解释选项的代码
optname:选项名
optval:是一个变量指针,getsockopt将返回的值存入该指针指向的空间,setsockopt则通过该指针获得参数
optlen:用于指定*optval的大小,注意两个函数之间参数的区别,getsockopt中是一个指针,而在setsockopt中是一个普通变量,所以在使用之前应该先定义变量,然后指向该变量。
参考代码:
//include 各头文件
int main( )
{
int sockfd;
int optval = 0;
int optlen = 4;
sockfd = socket ( AF_INET, SOCK_STREAM, 0 ); //打开一个套接口
getsockopt ( sockfd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen ); //用来获取接收缓冲区的大小参数
printf (" the buff size is %d\n", optval); //打印的结果与操作系统的默认值有关
optval = 100000;
setsockopt ( sockfd, SOL_SOCKET, SO_RCVBUF, &optval, optlen );
getsockopt ( sockfd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen );
printf (" the buff size is %d\n", optval); //打印出来的是100000
}
通过setsockopt函数设置指定的参数以后,可以改变系统的默认值,注意在调用getsockopt函数时,最后一个参数指向的值要与optval的大小相匹配,如上例中,如果optlen为0,那么getsockopt返回的optval的值也是0,没有任何意义。