- 1、本文档共49页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章节 套接字选项
第12章 套接字选项 本章对套接字配置的获取或者设置进行介绍,通过对本章的学习将能够掌握基本的套接字属性配置方法。主要包含三个方面套接字选项、ioctl函数与套接字有关的请求命令、fcntl与套接字有关的请求命令。套接字选项介绍如下方面的知识: 如何使用函数setsockopt()和函数getsockopt()。 SOL_SOCKET级别套接字选项介绍。 IPPTOTO_IP级别套接字选项介绍。 IPPROTO_TCP级别套接字选项介绍。 介绍几个进行使用套接字选项的例子。 12.1 获取和设置套接字选项getsocketopt()/setsocketopt() 在进行网络编程的时候,经常需要查看或者设置套接字的某些特性,例如设置地址复用、读写数据的超时时间、对读缓冲区的大小进行调整等等操作。获得套接字选项设置情况的函数是getsockopt(),设置套接字选项的函数为setsockopt()。 12.1.1 函数getsockopt()和setsocketopt()介绍 函数getsockopt()和函数setsockopt()的原型如下: #include sys/types.h #include sys/socket.h int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); 函数getsockopt()和函数setsockopt()的用来获取或者设置与某个套接字关联的选项。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当对套接字选项进行操作时,必须给出选项所处的层和选项的名称。为了操作套接字层的选项,应该将层的值指定为SOL_SOCKET。为了操作其它层的选项,必须给出控制选项的协议类型号。例如,为了表示一个选项由TCP协议解析,层应该设定为协议号TCP。 12.1.2 套接字选项 按照参数选项级别level值的不同,套接字选项大致可以分为3类。 通用套接字选项: IP选项: TCP选项: 12.1.3 套接字选项简单示例 12.1.2小节中介绍了套接字的选项,本小节介绍如何使用这些套接字选项进行程序设计。下面的例子显示本系统中可能支持的套接字选项的状态,在一个程序中获得系统所支持的套接字选项的默认值,并将结果打印出来。 1.定义选项所用的通用数据结构 2.数据类型的定义 3.列举的套接字选项 4.显示查询结果disp_outcome() 5.主函数main() 6.代码的编译执行 12.2 SOL_SOCKET协议族选项 SOL_SOCKET级别的套接字选项是通用类型的套接字选项,这个选项中可以命令字比较多,例如有SO_BROADCAST、SO_KEEPALIVE、SO_LINGE、SO_OOBINLINE、SO_RCVBUFF、SO_SNDBUFF等命令字对套接字的基本特性进行控制。 12.2.1 SO_BROADCAST广播选项 这个选项用于进行广播设置,默认情况下系统的广播是禁止的,因为很容易误用广播的功能造成网络灾难。为了避免偶尔的失误造成意外,默认情况下套接口禁用了广播。如果确实需要使用广播功能,需要用户打开此功能。 广播使用UDP套接字,其含义是允许将数据发送到子网网络的每个主机上。此项选项的输入数据参数是一个整型变量。当输入的值为0时,表示禁止广播,其他值表示允许广播。 12.2.2 SO_DEBUG调试选项 SO_DEBUG调试选项表示允许调试套接字,此选项仅支持TCP,当打开此选项时,Linux内核程序跟踪在此套接字上的发送和接收的数据,并将调试信息放到一个环形缓冲区中。 12.2.3 SO_DONTROUTE不经过路由选项 这个选项的设置使发出的数据分组不经过正常的路由机制。分组将按照发送数据的目的地址和子网掩码,选择一个合适的网络接口进行发送,而不用经过路由机制。如果不能有选定的网络接口确定,则会返回ENETUNREACH错误。选项设置后,网络数据不通过网关发送,只能发送给直接连接的主机或者用一个子网内的主机。可以通过将send()函数的选项设置中加上MSG_DONTROUTE标志来实现相同的效果。选项的值是布尔型整数的标识。 这个选项可以在两个网卡的的局域网内使用,系统根据发送的目的IP地址,自动匹配合适的子网,例如将子网A的数据发送到网络接口B上。 12.2.4 SO_ERROR错误选项 这个选项用来获得套接字错误,此套接字选项仅能够获取而不能进行设置。在Linux内核中的处理过程如下:
文档评论(0)