获取套接字的选项值(getsockopt)
【头文件】
#include <sys/types.h>
#include <sys/socket.h>
【函数原型】
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);
【函数功能】
用于获取一个套接字的选项
【参数含义】
[sockfd]: 待获取的通信套接字
[level]:协议层次,有如下选项:
SOL_SOCKET 套接字层次
IPPROTO_IP ip 层次
IPPROTO_TCP TCP 层次
[optname]: 选项名字,对于套接字层次有下面一些选项
SO_BROADCAST 是否允许发送广播信息
SO_REUSEADDR 是否允许重复使用本地地址 SO_SNDBUF 获取发送缓冲区长度
SO_RCVBUF 获取接收缓冲区长度
SO_RCVTIMEO 获取接收超时时间
SO_SNDTIMEO 获取发送超时时间
[optval]: 用来保存获取到的选项值
[optlen]: 用来保存选项值得长度
【返回值】
成功返回 0
失败返回-1,同时 errno 被设置
【示例】
获取发送缓冲区为多少 k 内存
int opt_val;
socklen_t opt_len = sizeof(opt_val);
if(getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &opt_val, &opt_len) < 0)
{perror("fail to getsockopt");
}
printf("send_buf = %dk\n", opt_val / 1024);
设置套接字的选项值(setsockopt)
【头文件】
#include <sys/types.h>
#include <sys/socket.h>
【函数原型】
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
【函数功能】
用于设置一个套接字的选项
【参数含义】
[sockfd]: 待设置的通信套接字
[level]:协议层次,有如下选项:
SOL_SOCKET 套接字层次
IPPROTO_IP ip 层次
IPPROTO_TCP TCP 层次
[optname]: 选项名字,对于套接字层次有下面一些常用选项
SO_BROADCAST 是否允许发送广播信息
SO_REUSEADDR 是否允许重复使用本地地址
SO_SNDBUF 获取发送缓冲区长度
SO_RCVBUF 获取接收缓冲区长度
SO_RCVTIMEO 获取接收超时时间
SO_SNDTIMEO 获取发送超时时间
对于 IP 层次有下面常用选项
IP_ADD_MEMBERSHIP 获取/设置加入的多播组
[optval]: 设置的选项值
[optlen]: 设置的选项值得长度
【返回值】
成功返回 0
失败返回-1,同时 errno 被设置
【示例】
设置当前的拖延值
struct linger
{u_short l_onoff;u_short l_linger;
};struct linger m_sLinger;
m_sLinger.l_onoff=1;//(在 closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
// 如果 m_sLinger.l_onoff=0;则功能和 2.)作用相同;
m_sLinger.l_linger=5;//(容许逗留的时间为 5 秒)
setsockopt(s,SOL_SOCKET,SO_LINGER,(constchar*)&m_sLinger,sizeof(linger));
选项汇总
套接字层次
选项名 | 选项值 数据类 型 | 访问权限 | 说明 |
SO_ACCEPTCONN | Bool | get | 如为 TRUE,表明套接字处于监听模式 |
SO_BROADCAST | bool | get/set | 如 TRUE,表明套接字已配置成对广播 消息进行发送 |
SO_CONNECT_TIME | int | get | 返回套接字建立连接的时间,以秒为 单位,如尚未连接,返回 0xffffffff |
SO_DEBUG | bool | Get/set | 如果 TRUE,就允许调试输出 (W32 不 支持) |
SO_DONTLINGER | bool | Get/set | 如果是 TRUE,则禁用SO_LINGER |
SO_LINGER | struct linger | get/set | 设置或获取当前的拖延值 |
SO_DONTROUTE | bool | get/set | 如果 TRUE,便直接向网络接口发送消息,毋需查询路由表 |
SO_ERROR | bool | get | 返回错误状态 |
SO_EXCLUSIVEADDRUSE | bool | get/set | 如果 TRUE,套接字绑定那个本地端口就不能重新被另一个进程使用 |
SO_KEEPALIVE | bool | get/set | 如果 TRUE,套接字就会进行配置,在会话过程中发送”保持活动”消息 |
SO_MAX_MSG_SIZE | unsign ed int | get | 对一个面向消息的套接字来说,一条消息的最大长度 |
SO_OOBINLINE | bool | get/set | 如果是 TRUE,带外数据就会在普通数据流中返回 (W32 不支持) |
SO_PROTOCOL_INFO | WSAPRO TOCOL_ INFO | get | 套接字绑定的那种协议的特征 |
SO_RCVBUF | int | get/set | 面向接收操作,为每个套接字分别获取或设置缓冲区长度 |
SO_REUSEADDR | bool | get/set | 如果是 TRUE,套接字就可与一个正由其他套接字使用的地址绑定到一起,或与处在 TIME_WAIT 状态的地址绑定到一起 |
SO_SNDBUF | bool | get/set | 设置分配给套接字的数据发送缓冲区的大小 |
SO_TYPE | int | get | 返回指定套接字的类型(如 SOCK_DGRAM 和 SOCK_STREAM 等等) |
SO_SNDTIMEO | int | get/set | 获取或设置套接字上的数据发送超时时间(以毫秒为单位) |
SO_RCVTIMEO | int | get/set | 获取或设置与套接字上数据接收对应的超时时间值(以毫秒为单位) |
SO_UPDATE_ACCEPT_CONTEXT | SOCKET | get/set | 更新 SOCKET 状态 |
IP 层次
TCP 层次
IP_ADD_MEMBERSHIP ip_mreq get/set 获取/设置加入的多播组