setsockopt()函数
·
目录
参考文献:
1.函数说明
翻译如下:
描述
getsockopt()和setsockopt()操作由文件描述符sockfd引用的套接字选项。选项可能存在于多个协议级别;
它们总是出现在socket的最高级别。
在操作套接字选项时,必须指定选项所在的级别和选项的名称。要在套接字API级别操作选项,level被指定为SOL_SOCKET。要在任何其他级别操作选项,将提供控制该选项的适当协议的协议号。例如,要表示一个选项是由TCP协议解释的,level应该设置为TCP的协议号;
看到getprotoent(3)。
参数optval和optlen用于访问setsockopt()的选项值。对于getsockopt(),它们标识一个缓冲区,其中
请求的选项将被返回。对于getsockopt(), optlen是一个value-result参数,最初包含由opt‐val指向的缓冲区的大小,并在返回时修改以指示返回值的实际大小。如果没有提供或返回选项值,则optval可能为NULL。
Optname和任何指定的选项被不解释地传递给适当的协议模块进行解释。包含文件包含套接字级别选项的定义,如下所述。其他协议级别的选项在格式和名称上有所不同;参考手册第4节中相应的条目。
大多数套接字级选项为optval使用int参数。对于setsockopt(),参数应该是非0以启用布尔值选项,如果禁用该选项则为0。
有关可用套接字选项的描述,请参阅套接字(7)和相应的协议手册页
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
参数说明:
(1) int sockfd: 很简单,socket句柄
(2) int level: 选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次
(3) int optname: 需设置的选项
(4) const void *optval: 指针,指向存放选项值的缓冲区
(5) socklen_t optlen: optval缓冲区的长度
2. 参数详解
optname定义如下:
#define SO_DEBUG 1 -- 打开或关闭调试信息
#define SO_REUSEADDR 2 -- 打开或关闭地址复用功能
#define SO_TYPE 3 --
#define SO_ERROR 4
#define SO_DONTROUTE 5
#define SO_BROADCAST 6
#define SO_SNDBUF 7 -- 设置发送缓冲区的大小
#define SO_RCVBUF 8 -- 设置接收缓冲区的大小
#define SO_KEEPALIVE 9 -- 套接字保活
#define SO_OOBINLINE 10
#define SO_NO_CHECK 11
#define SO_PRIORITY 12 -- 设置在套接字发送的所有包的协议定义优先权
#define SO_LINGER 13
#define SO_BSDCOMPAT 14
#define SO_REUSEPORT 15
#define SO_PASSCRED 16
#define SO_PEERCRED 17
#define SO_RCVLOWAT 18
#define SO_SNDLOWAT 19
#define SO_RCVTIMEO 20 -- 设置接收超时时间
#define SO_SNDTIMEO 21 -- 设置发送超时时间
#define SO_ACCEPTCONN 30
#define SO_SNDBUFFORCE 32
#define SO_RCVBUFFORCE 33
#define SO_PROTOCOL 38
#define SO_DOMAIN 39
3.实例
3.1 设置接收缓冲区大小
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(){
int sock_fd = -1;
//建立sock_fd套接字
if((sock_fd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
int recvBufSize = 0;
int len = sizeof(recvBufSize);
//-----------------------------------------------------------------------------------
getsockopt( sock_fd, SOL_SOCKET, SO_RCVBUF, &recvBufSize, ( socklen_t* )&len );
printf("默认buf大小: %d \n",recvBufSize);
//-----------------------------------------------------------------------------------
recvBufSize = 1024;
//设置buf 大小1024
setsockopt(sock_fd,SOL_SOCKET,SO_RCVBUF,(const char*)&recvBufSize,sizeof(int));
//再次读取buf大小
getsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &recvBufSize, ( socklen_t* )&len );
printf("设置1024后buf大小: %d \n",recvBufSize);
//-----------------------------------------------------------------------------------
recvBufSize = 1024*2;
//设置buf 大小1024
setsockopt(sock_fd,SOL_SOCKET,SO_RCVBUF,(const char*)&recvBufSize,sizeof(int));
//再次读取buf大小
getsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &recvBufSize, ( socklen_t* )&len );
printf("设置1024*2后buf大小: %d \n",recvBufSize);
close(sock_fd);
return 0;
}
运行结果如下:
得出以下结论:
(1) 各个系统socket有默认的buffer大小,此处我的大小是:128*1024 Byte;
(2) 当设置buffer大小为1024之后,读取的大小为2304,表明系统的最小buffer大小为2304;
(3) 当设置buffer大小为2048,读取的大小为4096,是我设置2048的两倍;相关的解释就是该操作将sock->sk->sk_rcvbuf设置为val * 2,可以看看kernel代码
3.2 设置接收超时时间
更多推荐
已为社区贡献1条内容
所有评论(0)