linux套接字选项—getsockopt和setsockopt

1.函数原型:

int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)

int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)

2.参数说明:level指定控制套接字的层次.可以取三种值:

1)SOL_SOCKET:通用套接字选项.

2)IPPROTO_IP:IP选项.

3)IPPROTO_TCP:TCP选项. 

optname指定控制的方式(选项的名称),我们下面详细解释 

optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 

选项名称        说明                数据类型

=============================================================

            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

=============================================================

3.返回说明:  

成功执行时,返回0。失败返回-1,errno被设为以下的某个值  

EBADF:sock不是有效的文件描述词

EFAULT:optval指向的内存并非有效的进程空间

EINVAL:在调用setsockopt()时,optlen无效

ENOPROTOOPT:指定的协议层不能识别选项

ENOTSOCK:sock描述的不是套接字

 

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

 

// 接收缓冲区

int nRecvBuf=32*1024;         //设置为32K

setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));

//发送缓冲区

int nSendBuf=32*1024;//设置为32K

setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

4.数据结构说明:

在上面有两个数据结构需要说明一下:

1)结构:linger,它的声明如下:

struct linger{

     int l_onoff;    //状态

     int l_linger;    //等待时间

};

2)结构:timeval,它的声明如下:

struct timeval{

     time_t    tv_sec;   //秒

     suseconds_t  tv_usec; //微秒:百万分之一秒

};

4.注意:

当设置TCP套接口接收缓冲区的大小时,函数调用顺序是很重要的,因为TCP的窗口规模选项是在建立连接时用SYN与对方互换得到的。对于客户,SO_RCVBUF选项必须在connect之前设置;对于服务器,SO_RCVBUF选项必须在listen前设置。

你可能感兴趣的:(网络编程)