原型:int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
参数
sockfd:一个标识套接口的描述字。
level:选项定义的层次。支持的层次仅有SOL_SOCKET和IPPROTO_TCP。
optname:需获取的套接口选项。
optval:指向存放所获得选项值的缓冲区。
optlen:指向optval缓冲区的长度值。
返回值:
成功返回0,失败返回SOCKET_ERROR
Optname:
SOL_SOCKET SO_REUSEADDR
SOL_SOCKET SO_KKEPALIVE
SOL_SOCKET SO_LINGER
SOL_SOCKET SO_BROADCAST
SOL_SOCKET SO_OOBINLINE
SOL_SOCKET SO_SNDBUF
SOL_SOCKET SO_RCVBUF
SOL_SOCKET SO_TYPE
SOL_SOCKET SO_ERROR
SOL_TCP SO_NODELAY
例子:
#include <errno.h>
#include <error.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "prin.h"
int main()
{
int ret=-1,s=-1;
int sndbuf=0,rcvbuf=0;
socklen_t optlen;
s = socket(PF_INET,SOCK_STREAM,0);
if(s==-1)
prin_info("creat error:%s",strerror(errno));
sndbuf = 5000;
ret = setsockopt(s,SOL_SOCKET,SO_SNDBUF,&sndbuf,sizeof sndbuf);
if(ret)
prin_info("setsockopt error:%s",strerror(errno));
rcvbuf = 8192;
ret = setsockopt(s,SOL_SOCKET,SO_RCVBUF,&rcvbuf,sizeof rcvbuf);
if(ret)
prin_info("setsockopt error:%s",strerror(errno));
optlen = sizeof(sndbuf);
ret = getsockopt(s,SOL_SOCKET,SO_SNDBUF,&sndbuf,&optlen);
if(ret)
prin_info("getsockopt error:%s",strerror(errno));
prin_info("sndbuf=%d",sndbuf);
optlen = sizeof(rcvbuf);
ret = getsockopt(s,SOL_SOCKET,SO_RCVBUF,&rcvbuf,&optlen);
if(ret)
prin_info("getsockopt error:%s",strerror(errno));
prin_info("revbuf=%d",rcvbuf);
close(s);
return 0;
}
输出结果:
[main][39]sndbuf=10000
[main][46]revbuf=16384
sndbuf: 最小值是2k,最大值是224K ;默认16k(fedora下面的值,不同平台有可能不一样);在inluce/net/sock.h里面有定义,小于最小值就使用最小值,最大值也一样。其他的用设置值的2倍
#define SOCK_MIN_SNDBUF 2048
#define SOCK_MIN_RCVBUF 256
rcvbuf:最小值是256,最大值是224k;默认87380。如果设置buf=200*1024;buf=224*1024