《套接字选项》PPT课件.ppt
《《套接字选项》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《套接字选项》PPT课件.ppt(49页珍藏版)》请在三一办公上搜索。
1、第12章 套接字选项,本章对套接字配置的获取或者设置进行介绍,通过对本章的学习将能够掌握基本的套接字属性配置方法。主要包含三个方面套接字选项、ioctl函数与套接字有关的请求命令、fcntl与套接字有关的请求命令。套接字选项介绍如下方面的知识:如何使用函数setsockopt()和函数getsockopt()。SOL_SOCKET级别套接字选项介绍。IPPTOTO_IP级别套接字选项介绍。IPPROTO_TCP级别套接字选项介绍。介绍几个进行使用套接字选项的例子。,12.1 获取和设置套接字选项getsocketopt()/setsocketopt(),在进行网络编程的时候,经常需要查看或者设
2、置套接字的某些特性,例如设置地址复用、读写数据的超时时间、对读缓冲区的大小进行调整等等操作。获得套接字选项设置情况的函数是getsockopt(),设置套接字选项的函数为setsockopt()。,12.1.1 函数getsockopt()和setsocketopt()介绍,函数getsockopt()和函数setsockopt()的原型如下:#include#include int getsockopt(int s,int level,int optname,void*optval,socklen_t*optlen);int setsockopt(int s,int level,int op
3、tname,const void*optval,socklen_t optlen);函数getsockopt()和函数setsockopt()的用来获取或者设置与某个套接字关联的选项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当对套接字选项进行操作时,必须给出选项所处的层和选项的名称。为了操作套接字层的选项,应该将层的值指定为SOL_SOCKET。为了操作其它层的选项,必须给出控制选项的协议类型号。例如,为了表示一个选项由TCP协议解析,层应该设定为协议号TCP。,12.1.2 套接字选项,按照参数选项级别level值的不同,套接字选项大致可以分为3类。通用套接字选项:IP选项
4、:TCP选项:,12.1.3 套接字选项简单示例,小节中介绍了套接字的选项,本小节介绍如何使用这些套接字选项进行程序设计。下面的例子显示本系统中可能支持的套接字选项的状态,在一个程序中获得系统所支持的套接字选项的默认值,并将结果打印出来。1定义选项所用的通用数据结构2数据类型的定义3列举的套接字选项4显示查询结果disp_outcome()5主函数main()6代码的编译执行,12.2 SOL_SOCKET协议族选项,SOL_SOCKET级别的套接字选项是通用类型的套接字选项,这个选项中可以命令字比较多,例如有SO_BROADCAST、SO_KEEPALIVE、SO_LINGE、SO_OOBI
5、NLINE、SO_RCVBUFF、SO_SNDBUFF等命令字对套接字的基本特性进行控制。,12.2.1 SO_BROADCAST广播选项,这个选项用于进行广播设置,默认情况下系统的广播是禁止的,因为很容易误用广播的功能造成网络灾难。为了避免偶尔的失误造成意外,默认情况下套接口禁用了广播。如果确实需要使用广播功能,需要用户打开此功能。广播使用UDP套接字,其含义是允许将数据发送到子网网络的每个主机上。此项选项的输入数据参数是一个整型变量。当输入的值为0时,表示禁止广播,其他值表示允许广播。,12.2.2 SO_DEBUG调试选项,SO_DEBUG调试选项表示允许调试套接字,此选项仅支持TCP,
6、当打开此选项时,Linux内核程序跟踪在此套接字上的发送和接收的数据,并将调试信息放到一个环形缓冲区中。,12.2.3 SO_DONTROUTE不经过路由选项,这个选项的设置使发出的数据分组不经过正常的路由机制。分组将按照发送数据的目的地址和子网掩码,选择一个合适的网络接口进行发送,而不用经过路由机制。如果不能有选定的网络接口确定,则会返回ENETUNREACH错误。选项设置后,网络数据不通过网关发送,只能发送给直接连接的主机或者用一个子网内的主机。可以通过将send()函数的选项设置中加上MSG_DONTROUTE标志来实现相同的效果。选项的值是布尔型整数的标识。这个选项可以在两个网卡的的局
7、域网内使用,系统根据发送的目的IP地址,自动匹配合适的子网,例如将子网A的数据发送到网络接口B上。,12.2.4 SO_ERROR错误选项,这个选项用来获得套接字错误,此套接字选项仅能够获取而不能进行设置。在Linux内核中的处理过程如下:(1)当套接字发生错误的时候,兼容BSD的网络协议将内核中的变量so_error设置为形如UNIX_Exxx的值。(2)内核通过两种方式通知用户进程:(3)进程在返回后,可以通过getsockopt的SO_ERROR选项获得发生的错误号,这个值通过一个int类型的变量获得。,12.2.5 SO_KEEPALIVE保持链接选项,选项SO_KEEPALIVE用于
8、设置TCP连接的保持,当设置此项后,连接会测试链接的状态。这个选项用于可能长时间没有数据交流的连接,通常在服务器端进行设置。当设置SO_KEEPALIVE选项后,如果在两个小时内没有数据通信时,TCP会自动发送一个活动探测数据报文,对方必须对此进行响应,通常有如下3种情况。TCP的连接正常,发送一个ACK响应,这个过程应用层是不知道的。再过两个小时,又会再发送一个。对方发送RST响应,对方在2个小时内进行了重启或者崩溃。之前的连接已经失效,套接字收到一个ECONNRESET错误,之前的套接字关闭。,12.2.6 SO_LINGER缓冲区处理方式选项,选项SO_LINGER用于设置TCP连接关闭
9、时的行为方式,就是关闭流式连接时的发送缓冲区中的数据如何处理。1SO_LINGER选项的含义2套接字关闭的过程3选项SO_LINGER的例子,12.2.7 SO_OOBINLINE带外数据处理方式选项,带外数据放入正常数据流,在普通数据流中接收带外数据。当进行了此项的设置后,带外数据不再通过另外的通道获得,数据在普通数据流中可以获得带外数据。在某些情况下,发送的数据会超过所限制的数据量。通常这些数据使用不同于通常情况的接收方式来进行的,使用SO_OOBINLINE可以设置使用通用方法来接收带外数据。,12.2.8 SO_RCVBUF和SO_SNDBUF缓冲区大小选项,选项SO_RCVBUF和S
10、O_SNDBUF用于操作发送缓冲区和接收缓冲区的大小,对于每个套接字对应均有发送缓冲区和接收缓冲区。接收缓冲区用于保存网络协议栈收到的数据,直到应用程序成功的读取;发送缓冲区则需要保存发送的数据直到发送成功。,12.2.9 SO_RCVLOWAT和SO_SNDLOWAT缓冲区下限选项,发送缓冲区下限选项SO_RCVLOWAT和接收缓冲区下限选项SO_SNDLOWAT用来调整缓冲区的下限值。函数select()使用发送缓冲区下限和接收缓冲区下限来判断可读和可写。当select()轮询可读的时候,接收缓冲区中的数据必须达到可写的下限值,select()才返回。对于TCP和UDP,默认的值均为1,即
11、接收到一个字节的数据select函数就可以返回。当select()轮询可写的时候,需要发送缓冲区中的空闲空间大小达到下限值时,函数才返回。对于TCP通常为2048个字节。UDP的发送缓冲区的可用空间字节数从不发生变化,为发送缓冲区的大小,因此只要UDP套接字发送的数据小于发送缓冲区的大小,就总是可以发送的。,12.2.10 SO_RCVTIMEO和SO_SNDTIMEO收发超时选项,选项SO_RCVTIMEO表示接收数据的超时时间,SO_SNDTIMEO表示发送数据的超时时间,默认情况下在接收和发送数据的时候是不会超时的,例如recv()函数当没有数据的时候会永远阻塞。这两个选项影响到的函数有
12、如下两类:接收超时影响的5个函数为:read()、readv()、recv()、recvfrom()和recvmsg()。发送超时影响的5个函数为write()、writev()、send()、sendto()和sendmsg()。,12.2.11 SO_REUSERADDR地址重用选项,这个参数表示允许重复使用本地地址和端口,这个设置在服务器程序中经常使用。例如某个服务器进程占用了TCP的80端口进行侦听,当再次在此端口侦听时会返回错误。设置SO_REUSEADDR可以解决这个问题,允许共用这个端口。某些非正常退出的服务器程序,可能需要占用端口一段时间才能允许其他进程使用,即使这个程序已经死
13、掉,内核仍然需要一段时间才能释放此端口,不设置SO_REUSEADDR将不能正确绑定端口。,12.2.12 SO_EXCLUSIVEADDRUSE端口独占选项,与SO_REUSEADDR相反,SO_EXCLUSIVEADDRUSE选项表示以独占的方式使用端口,不允许其他应用程序占用此端口,此时不能使用SO_REUSEADDR来共享使用某一个端口。选项SO_REUSEADDR可以对一个端口进行多重绑定,即如果没有使用选项SO_EXCLUSIVEADDRUSE显示的设置某一端口的不可绑定状态。多个进程可以同时绑定在某个端口上,即使调用SO_REUSEADDR的用户权限低,也就是说低级权限的用户是可
14、以重绑定在高级权限如服务启动的端口上的,这是一个非常大的安全隐患,造成程序可以被很容易的监听。如果不想让程序被监听,需要使用本选项进行设置。,12.2.13 SO_TYPE套接字类型选项,这个选项用于设置或者获得套接字的类型,例如SOCK_STREAM或者SOCK_DGRAM等表示套接字类型的数值。这个套接字选项经常用在忘记套接字类型或者不知道套接字类型的情况。例如,在如下的代码中先建立一个TCP套接字,但是之后忘记这个套接字的类型了,可以使用SO_TYPE选项获取其类型。s=socket(AF_INET,SOCK_STREAM,0);int type;int length=4;err=get
15、sockopt(s,SOL_SOCKET,SO_TYPE,12.2.14 SO_BSDCOMPAT与BSD套接字兼容选项,选项SO_BSDCOMPAT表示是否与BSD套接字兼容。目前这个选项存在一些安全漏洞,如果没有特殊的原因不要使用这个选项。例如,Linux的内核中的net/core/sock.c文件中,获得套接字选项的函数sock_getsockopt()函数中,如果设置了SO_BSDCOMPAT选项的话,其中的参数会被错误初始化并将值返回给调用的用户,导致信息泄漏。,12.2.15 SO_BINDTODEVICE套接字网络接口绑定选项,套接字选项SO_BINDTODEVICE可以将套接字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 套接字选项 套接 选项 PPT 课件

链接地址:https://www.31ppt.com/p-5632172.html