分类: 系统运维
2012-04-03 09:57:02
套接字机制为我们提供两个套接字选项接口来控制套接字的行为。一个接口用来设置选项,而另一 个接口允许我们查询一个选项的状态。我们可以得到并设置三种选项:
1、普通选项,和所有套接字一起工作。
2、在套接字级被管理的,但取决于底下的协议的支持选项。
3、协议指定选项,每个协议个体只有唯一一个。
SUS只定义了套接字级的选项(上述列表里的前两个选项类型)。
我们可以用setsockopt函数设置一个套接字选项。
level 参数标识选项要应用到的协议。如果选项是一个通用套接字级的选项,那么level被设置为SOL_SOCKET,否则,level被设置为控制这个选项的 协议号。例子有TCP选项的IPPROTO_TCP和IP选项的IPPROTO_IP。下表总结了由SUS定义的通用的套接字级的选项。
选项 | val参数类型 | 描述 |
---|---|---|
SO_ACCEPTCONN | int | 返回一个套接字是否为监听开启(只应用于getsockopt) |
SO_BROADCAST | int | 如果*val非0,则广播数据报 |
SO_DEBUG | int | 如果*val非0,则开启网络驱动的调试 |
SO_DONTROUTE | int | 如果*val非0,则绕过通常的路由 |
SO_ERROR | int | 返回并清理待定的套接字错误(只应用于getsockopt) |
SO_KEEPALIVE | int | 如果*val非0,则开启定期的keep-alive消息 |
SO_LINGER | struct linger | 当存在未发送的消息且套接字被关闭时的延迟时间 |
SO_OOBINLINE | int | 如果*val非0,不同频道的数据被内嵌到普通数据里 |
SO_RCVBUF | int | 接收缓冲的字节尺寸。 |
SO_RCVLOWAT | int | 当一个接收调用上要返回的数据的最少的量。 |
SO_RCVTIMEO | struct timeval | 一个套接字接收调用的计时值 |
SO_REUSEADDR | int | 如果*val非0,则重用bind里的地址 |
SO_SNDBUF | int | 发送缓冲的字节尺寸 |
SO_SNDLOWAT | int | 在一个发送调用里要传送的数据的最少的量。 |
SO_SNDTIMEO | struct timeval | 一个套接字发送调用的计时值 |
SO_TYPE | int | 标识套接字类型(只适用于getsockopt) |
val参数指向一个数据结构或一个整型,取决于选项。一些选项是开关。如果整型非0,那么选项被开启。如果整型为0,则选项被禁用。len参数指定val指向的对象的尺寸。
我们可以用getsockopt函数找到当前一个选项的值。
注意lenp参数是一个整型指针。在调用getsockopt前,我们设置这个整型为选项要拷贝到的缓冲的尺寸。如果选项的真实尺寸比这个尺寸大,那么选项被静默地裁切。如果选项的真实尺寸比这个尺寸小,那么在返回时这个整型被更新为真实的尺寸。
16.4节的initserver函数在服务器终止而我们尝试立即重启它时不能恰当地操作。通常,TCP的实现阻止我们绑定到相同的地址,直到计时到时,它通常大概是几分钟。幸运地,SO_REUSEADDR套接字选项允许我们绕过这个限制,如下面的代码所演示的。