第七章 套接字选项

第七章 套接字选项

先介绍改变和获取套接字选项的两个函数

intsetsockopt(int fd, int level, int optname, const void* optval, socklen_t*optlen);

intgetsockopt(int fd, int level, int optname, void* optval, socklen_t *len);

fd 是已经打开的套接字(调用socket之后)level是指定系统中解释选项的代码:普通套接口代码或者特定于协议的代码 optname是针对level的,是level下的子项,opval是获得的结果,通过getsockopt或者level中的optname字段的套接字属性(性质),其中len是表示optval的大小,这些level和optname之间的关系如下表


以上的表对于level的字段都是可以设置的标志是optname

 

对于某些字段选项,有一定的时序关系,下面的选项都是从监听套接口继承来的,如果对某些已经连接的套接口使用这些选项的话,那么就得对监听套接口设置这些选项,这样就会继承下来。这些标志是:SO_DEBUG, SO_DONTROUTE,SO_KEEPALIVE, SO_LINGER, SO_OOBINLINE, SO_RCVBUF, SO_SNDBUF。

 

基本套接口选项:

SO_BROADCAST:此选项使能或禁止进程发送广播信息的能力,必须是数据报套接口,而且是支持广播的网络上。

SO_DEBUG:此选项支持TCP,当给一个TCP套接口加上这个标志的时候,内核对该TCP套接口接受和发送的数据的所有分组进行跟踪详细信息,这些信息保存在内核的环形缓冲区中,可又程序trpt来进行检查

SO_DONTROUTE:此选项规定发出的分组将旁路底层协议的正常路由机制,根据目的地址和子网部分所确定的本地接口,如果本地接口不能由目的地址确定的话,就直接返回ENETUNREACH

参考:http://blog.chinaunix.net/space.php?uid=7897183&do=blog&id=75415

SO_ERROR:当套接口上发生错误的时候,内核会通知进程按照如下方式:

socket阻塞在select时候,发生错误,返回

进程使用信号驱动I/O模型的时候,就会给进程发送SIGIO信号

SO_KEEPALIVE:如果给定一个TCP设置了这个标志时候,如果两个小时之间cs之间没有任何数据进行来往的话,这个TCP套接口就会向另外一端发送一个保持存活的探测分节一下是另外一端的响应:

1如果另外一端正确的返回ack数据报,那么如果之后的交互中两个小时之内没有数据交互的话,还是会发送这样的探测分节

2如果另外一端返回的是RST数据报,说我这段已经崩溃,得重新建立连接,,套接口待处理错误被设置为ECONNRESET

3如果发送了探测分节,但是另外一端没有反应则设置标志为ETIMEOUT如果收到了ICMP数据报的话,错误标志就会设置成EHOSTUNREACH

SO_LINGER:此选项是close面向连接的时候是如何操作的(例如tcp而不是udp)close的默认操作如果缓冲区中有数据,发送完这些数据后返回,如果没有数据直接返回,在setsockopt设置的optval的类型是

structlinger{

                     int l_onoff;

                     int l_linger

}

l_onoff为0的时候表示关闭这个功能,非0的时候开启这个功能

l_linger为0 的时候,丢弃缓冲区中的数据,并且直接发送RST数据包

l_linger 为非0的时候,进程就会休眠,等待发送完缓冲区的数据(同时收到ack包)或者l_linger时间到的时候才返回,套接字设置为非阻塞的,则close操作直接返回

SO_OOBINLINE:当此选项打开是,带外数据将被留在正常的输入队列中(即在线存放)

SO_RCVBUF:设置接受缓冲区的大小

SO_SNDBUF:设置发送缓冲区的大小。

对于TCP来说,套接口的接受缓冲区的可用空间大小就是TCP通告另外的窗口大小。TCP套接口的缓冲区不可能溢出,因为对方不允许发出超过所通告的窗口大小的数据,这就是TCP的流量控制

对于UDP当内核缓冲区不能存储下收到的数据报数据的时候,次数据报就会被丢弃

SO_RCVLOWATSO_SNDLOWAT是接受低潮限度和发送低潮限度,发送的时候,数据得大于SO_SNDLOWAT才能被发送,接受的数据大于SO_RCVLOWAT的值得时候read才能返回。

SO_RCVTIMEOSO_SNDTIMEO是设置接受和发送超时,optval设置的是timeval的值,用来设置超时的时间

SO_REUSEADDRSO_REUSEPORT是重用地址和端口

SO_TYPE这个返回套接字的类型 SOCK_STREAM SOCK_DGRAM
SO_USELOOPBACK:此选项设置路由域的套接口(AF_ROUTE)这些套接口的缺省设置是打开的,此选项打开时,套接口拷贝从该套接口发送的数据。

这些仅仅是SOL_SOCK的标志(与协议无关)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值