目录

1.函数说明

2. 参数详解


参考文献:


setsockopt用法大全

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 设置接收超时时间

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐