首页 > 代码库 > setsockopt()用法

setsockopt()用法

头文件:#include <sys/types.h>   #include <sys/socket.h>

定义函数:int setsockopt(int s, int level, int optname, const void * optval, ,socklen_toptlen);

函数说明:

s         :setsockopt()用来设置参数s 所指定的socket 状态.

level   :参数level 代表欲设置的网络层, 一般设成SOL_SOCKET 以存取socket 层.协议层参数指明了我们希望访问一个选项所在的协议栈。通常我们需要使用下面中的一个:
             SOL_SOCKET来访问套接口层选项
             SOL_TCP来访问TCP层选项

optname:代表欲设置的选项, 有下列几种数值:

参数optname 代表欲设置的选项, 有下列几种数值:
   SO_DEBUG 打开或关闭排错模式
   SO_REUSEADDR 允许在bind ()过程中本地地址可重复使用
   SO_TYPE 返回socket 形态.
   SO_ERROR 返回socket 已发生的错误原因
   SO_DONTROUTE 送出的数据包不要利用路由设备来传输.
   SO_BROADCAST 使用广播方式传送
   SO_SNDBUF 设置送出的暂存区大小
   SO_RCVBUF 设置接收的暂存区大小
   SO_KEEPALIVE 定期确定连线是否已终止.
   SO_OOBINLINE 当接收到OOB 数据时会马上送至标准输入设备
   SO_LINGER 确保数据安全且可靠的传送出去.
选项名称        说明                  数据类型
========================================================================
            SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST      允许发送广播数据            int
SO_DEBUG        允许调试                int
SO_DONTROUTE      不查找路由               int
SO_ERROR        获得套接字错误             int
SO_KEEPALIVE      保持连接                int
SO_LINGER        延迟关闭连接              struct linger
SO_OOBINLINE      带外数据放入正常数据流         int
SO_RCVBUF        接收缓冲区大小             int
SO_SNDBUF        发送缓冲区大小             int
SO_RCVLOWAT       接收缓冲区下限             int
SO_SNDLOWAT       发送缓冲区下限             int
SO_RCVTIMEO       接收超时                struct timeval
SO_SNDTIMEO       发送超时                struct timeval
SO_REUSERADDR      允许重用本地地址和端口         int
SO_TYPE         获得套接字类型             int
SO_BSDCOMPAT      与BSD系统兼容              int
========================================================================
            IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL       在数据包中包含IP首部          int
IP_OPTINOS       IP首部选项               int
IP_TOS         服务类型
IP_TTL         生存时间                int
========================================================================
            IPPRO_TCP
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大数据段的大小           int
TCP_NODELAY       不使用Nagle算法             int
========================================================================

返回说明:  
成功执行时,返回0。失败返回-1,errno被设为以下的某个值  
EBADF:sock不是有效的文件描述词
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock描述的不是套接字

SO_RCVBUF和SO_SNDBUF每个套接口都有一个发送缓冲区和一个接收缓冲区,使用这两个套接口选项可以改变缺省缓冲区大小。


参数 optval 代表欲设置的值, 参数optlen 则为optval 的长度.

返回值:成功则返回0, 若有错误则返回-1, 错误原因存于errno.

附加说明:
1、EBADF 参数s 并非合法的socket 处理代码
2、ENOTSOCK 参数s 为一文件描述词, 非socket
3、ENOPROTOOPT 参数optname 指定的选项不正确.
4、EFAULT 参数optval 指针指向无法存取的内存空间.



在TCP连接中,recv等函数默认为阻塞模式(block),即直到有数据到来之前函数不会返回,而我们有时则需要一种超时机制使其在一定时间后返回而不管是否有数据到来,这里我们就会用到setsockopt()函数:
    int  setsockopt(int  s, int level, int optname, void* optval, socklen_t* optlen);
    这里我们要涉及到一个结构:
    struct timeval
    {
            time_t tv_sec;
            time_t tv_usec;
    };
    这里第一个域的单位为秒,第二个域的单位为微秒。
    struct timeval tv_out;
    tv_out.tv_sec = 1;
    tv_out.tv_usec = 0;
    填充这个结构后,我们就可以以如下的方式调用这个函数:
    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv_out, sizeof(tv_out));(具体参数可以man一下
    这样我们就设定了recv()函数的超时机制,当超过tv_out设定的时间而没有数据到来时recv()就会返回0值。

setsockopt()用法