Unix网络编程之套接口选项

在Unix网络编程中,有非常多的套接口选项(虽然其中大多数并不常见),如下表所示:

套接口层和IP层的套接口选项汇总

Unix网络编程之套接口选项_第1张图片Unix网络编程之套接口选项_第2张图片Unix网络编程之套接口选项_第3张图片Unix网络编程之套接口选项_第4张图片


传输层的套接口选项汇总:

Unix网络编程之套接口选项_第5张图片

套接口选项分为两大基本类型:一是开启或禁止某个特性的二元选项(称为标志选项),二是取得并返回我们可以设置或检查的特定值的选项(称为值选项)。在标志栏下有“ √ ”,说明这是一个标志选项,用于开启或关系某个功能;当这些标志选项调用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,没有任何意义。


你可能感兴趣的:(unix网络编程)