获取套接字的选项值(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 获取/设置加入的多播组