套接字具有多种特性,这些特性可通过可选项更改。本章将介绍更改套接字可选项的方法,并以此为基础进一步观擦套接字内部。
我们之前写的程序都是创建好套接字后(未经特别操作)直接使用,此时通过默认的套接字特征进行数据通信。之前的示例较为简单,无需特别操作套接字特性,但有时的确需要更改。
从表中可以看出,套接字可选项是分层的。IPPROTO_IP层可选项是IP协议相关事项,IPPROTO_TCP层可选项是TCP协议相关的事项,SOL_SOCKET层套接字相关的通用可选项。
也许有人看到表格会产生畏惧感,但现在无需全部背下来或理解,因此不必有负担。实际能够设置的可选项数量就是表的好几倍,也无需一下子理解所有可选项,实际工作中注意掌握即可。接触的可选项多了,自然会掌握大部分重要的。本书也只介绍其中一部分重要的可选项含义及更改方法。
getsockopt&setsockopt
我们几乎可以针对表中所有可选项进行读取(Get)和设置(Set)(当然,有些可选项只能进行一种操作)。可选项的读取和设置通过如下2个函数完成。
#include <sys/socket.h>
int getsockopt(int sock, int level, int optname, void *optval,
socklen_t *optlen);
/*
* 成功时返回0, 失败时返回-1
* sock 用于查看选项套接字文件描述符
* level 要查看的可选项的协议层
* optname 要勘察的可选项名
* optval 保存查看结果的缓冲地址值
* optlen 向第四个参数optval传递的缓冲大小。调用函数后,该变量中保存通过第四个参数返回的可选项信息的字节数
*/
上述函数用于读取套接字可选项,并不难。接下来介绍更改可选项时调用的函数。
#include <sys/socket.h>
int setsockopt(int sock, int level, int optname, const void *optval,
socklen_t optlen);
/*
* 成功时返回0,失败时返回-1
* sock 用于更改可选项的套接字文件描述符
* level 要更改的可选项协议层
* optname 要更改的可选项名
* optval 保存要更改的选项信息的缓冲地址值
* optlen 向第四个参数optval传递的可选项信息的字节数
*/
SO_SNDBUF & SO_RCVBUF
前面介绍过,创建套接字将同时生成I/O缓冲。如果各位忘了这部分内容,可以复习第5章。接下来将介绍I/O缓冲相关可选项。
SO_RCVBUF是输入缓冲大小相关可选项,SO_SNDBUF是输出缓冲大小相关可选项。用这2个可选项既可以读取当前I/O缓冲大小,也可以进行更改。通过下列下列读取创建套接字时默认的I/O缓冲大小。