setsockopt
#include <sys/socket.h>
int setsockopt( int socket, int level, int option_name,
const void *option_value, size_t option_len);
第一个参数socket是套接字描述符。第二个参数level是被设置的选项的级别,如果想要在套接字级别上设置选项,就必须把level设置为 SOL_SOCKET。option_name指定准备设置的选项,option_name可以有哪些取值,这取决于level,以linux 2.6内核为例(在不同的平台上,这种关系可能会有不同),在套接字级别上(SOL_SOCKET),option_name可以有以下取值:
- SO_DEBUG,打开或关闭调试信息。
当option_value不等于0时,打开调试信息,否则,关闭调试信息。它实际所做的工作是在sock->sk->sk_flag中置SOCK_DBG(第10)位,或清SOCK_DBG位。 - SO_REUSEADDR,打开或关闭地址复用功能。
当option_value不等于0时,打开,否则,关闭。它实际所做的工作是置sock->sk->sk_reuse为1或0。 - SO_DONTROUTE,打开或关闭路由查找功能。
当option_value不等于0时,打开,否则,关闭。它实际所做的工作是在sock->sk->sk_flag中置或清SOCK_LOCALROUTE位。 - SO_BROADCAST,允许或禁止发送广播数据。
当option_value不等于0时,允许,否则,禁止。它实际所做的工作是在sock->sk->sk_flag中置或清SOCK_BROADCAST位。 - SO_SNDBUF,设置发送缓冲区的大小。
发送缓冲区的大小是有上下限的,其上限为256 * (sizeof(struct sk_buff) + 256),下限为2048字节。该操作将sock->sk->sk_sndbuf设置为val * 2,之所以要乘以2,是防
止大数据量的发送,突然导致缓冲区溢出。最后,该操作完成后,因为对发送缓冲的大小作了改变,要检查sleep队列,如果有进程正在等待写,将它们唤醒。 - SO_RCVBUF,设置接收缓冲区的大小。
接收缓冲区大小的上下限分别是:256 * (sizeof(struct sk_buff) + 256)和256字节。该操作将sock->sk->sk_rcvbuf设置为val * 2。 - SO_KEEPALIVE,套接字保活。
如果协议是TCP,并且当前的套接字状态不是侦听(listen)或关闭(close),那么,当option_value不是零时,启用TCP保活定时器,否则关闭保活定时器。对于所有协议,该操
作都会根据option_value置或清sock->sk->sk_flag中的 SOCK_KEEPOPEN位。 - SO_OOBINLINE,紧急数据放入普通数据流。
该操作根据option_value的值置或清sock->sk->sk_flag中的SOCK_URGINLINE位。 - SO_NO_CHECK,打开或关闭校验和。
该操作根据option_value的值,设置sock->sk->sk_no_check。 - SO_PRIORITY,设置在套接字发送的所有包的协议定义优先权。Linux通过这一值来排列网络队列。
这个值在0到6之间(包括0和6),由option_value指定。赋给sock->sk->sk_priority。 - SO_LINGER,如果选择此选项, close或 shutdown将等到所有套接字里排队的消息成功发送或到达延迟时间后>才会返回. 否则, 调用将立即返回。
该选项的参数(option_value)是一个linger结构:
struct linger {
int l_onoff; /* 延时状态(打开/关闭) */
int l_linger; /* 延时多长时间 */
};
如果linger.l_onoff值为0(关闭),则清sock->sk->sk_flag中的SOCK_LINGER位;否则,置该位,并赋sk->sk_lingertime值为linger.l_linger。 - SO_PASSCRED,允许或禁止SCM_CREDENTIALS 控制消息的接收。
该选项根据option_value的值,清或置sock->sk->sk_flag中的SOCK_PASSCRED位。 - SO_TIMESTAMP,打开或关闭数据报中的时间戳接收。
该选项根据option_value的值,清或置sock->sk->sk_flag中的SOCK_RCVTSTAMP位,如果打开,则还需设sock->sk->sk_flag中的SOCK_TIMESTAMP位,同时,将全局变量
netstamp_needed加1。 - SO_RCVLOWAT,设置接收数据前的缓冲区内的最小字节数。
在Linux中,缓冲区内的最小字节数是固定的,为1。即将sock->sk->sk_rcvlowat固定赋值为1。 - SO_RCVTIMEO,设置接收超时时间。
该选项最终将接收超时时间赋给sock->sk->sk_rcvtimeo。 - SO_SNDTIMEO,设置发送超时时间。
该选项最终将发送超时时间赋给sock->sk->sk_sndtimeo。 - SO_BINDTODEVICE,将套接字绑定到一个特定的设备上。
该选项最终将设备赋给sock->sk->sk_bound_dev_if。 - SO_ATTACH_FILTER和SO_DETACH_FILTER。
关于数据包过滤,它们最终会影响sk->sk_filter。
以上所介绍的都是在SOL_SOCKET层的一些套接字选项,如果超出这个范围,给出一些不在这一level的选项作为参数,最终会得到- ENOPROTOOPT的返回值。但以上的分析仅限
于这些选项对sock-sk的值的影响,这些选项真正如何发挥作用,我们的探索道路将漫漫其修远。
setsockopt相关推荐
- Linux下getsockopt/setsockopt 函数说明
[getsockopt/setsockopt系统调用] 功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套 ...
- 浅析:setsockopt()改善程序的健壮性【转】
不断的收到coolmei25 (梅生)的答谢,我都不好意思了(我都没帮到他),下面 写出我在网络编程中的一点心得体会,希望对他(^_^也对大家)有帮助: 1. 如果在已经处于 ESTABLISHED状 ...
- winsock setsockopt 详解
setsockopt() 简述: 设置套接口的选项. #include <winsock.h> int PASCAL FAR setsockopt( SOCKET s, int level ...
- 网络编程学习笔记(getsockopt和setsockopt函数)
其原型为: #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, ...
- setsockopt 设置socket 详细用法
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET , ...
- setsockopt()函数功能介绍
setsockopt()函数功能介绍 功能描述:获取或者设置与某个套接字关联的选项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层. 用法: #include <sys/types.h ...
- setsockopt()函数使用详解
博客原创链接:http://blog.csdn.net/tody_guo/article/details/5972588 1. closesocket(一般不会立即关闭而经历TIME_WAIT的过程) ...
- setsockopt()使用方法(參数具体说明)
int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen ); s(套接字): 指向一个打开的套 ...
- Linux内核和应用层程序通信get/setsockopt示例
最近开发一个realtek网卡配置程序,基于realtek提供的一套配置程序代码开发,分析代码的时候发现用户层和驱动之间传递消息是使用的是setsockopt.getsockopt,这个对我来说比较新 ...
最新文章
- C#调用非托管C++DLL:直接调用法
- 技术有温,代码有爱——1024技术公益信息无障碍
- python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案
- 每日一题(34)—— 线程
- jQuery EasyUI DataGrid Checkbox 数据设定与取值
- PXE环境下安装系统(DHCP+TFTP+HTTP+kickstart)
- 转:C++中STL用法总结
- 20170813xlVBA跨表筛选数据
- paip.提升用户体验---提示语
- POJ 3134 - Power Calculus (IDDFS)
- 常用的在线翻译工具及实例对比初探
- 关于H3C-WAP712C AP的胖瘦切换说明
- 软件的发展历史(时间轴)
- 使用python定义量化指标公式
- 阿里应届程序员年薪25W,我酸了,你们呢
- 妮可妮可妮 [Hash]
- SDUTOJ打字训练
- Redis命令之集合(无序)
- uiview 渐变_UIView的背景渐变
- NR 物理资源(pointA,PRB,CRB之间关系)
热门文章
- 皮一皮:据说烤红薯都是这样的...
- 如何防范SpringBoot 相关漏洞?
- String长度有限制吗?是多少?还好我看过
- 疯抢当当图书 618 优惠码,花 120 买 300
- MySQL百万级数据分页查询及优化
- java流处理为什么快_“任何情况下,都不可以堕胎”是道德普遍主义的观点。
- 协议地址结构_通信之路——用最简洁的文字告诉你互联网协议TCP/IP
- 帝国cms7.5电脑端手机端多终端解决方案之选择哪种方案
- python 画roc曲线
- elasticsearch match模糊查询