美文网首页
setsockopt

setsockopt

作者: 上官宏竹 | 来源:发表于2022-11-29 11:33 被阅读0次

    总览

    打开一个网络socket后可以使用set/getsockopt可实现用户空间与内核的通信,本质和ioctl差不多,区别在于set/getsockopt不用新建设备,直接利用系统已有的socket类型就可以进行,可用setsockopt函数向内核写数据,用getsockopt向内核读数据。

    #include <sys/types.h>
    #include <sys/socket.h>
    int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
    int setsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
    
    参数:

    sock:将要被设置或者获取选项的套接字。socket描述符
    level:选项所在的协议层。proto是sock协议,IP RAW的就用SOL_SOCKET/SOL_IP等,TCP/UDP socket的可用SOL_SOCKET/SOL_IP/SOL_TCP/SOL_UDP等,即高层的socket是都可以使用低层socket的命令字的
    optname:需要访问的选项名。操作命令字,由自己定义
    optval:对于getsockopt(),指向返回选项值的缓冲。对于setsockopt(),指向包含新选项值的缓冲。数据缓冲区起始位置指针,set操作时是将缓冲区数据写入内核,get的时候是将内核中的数据读入该缓冲区
    optlen:数据长度。对于getsockopt(),作为入口参数时,选项值的最大长度。作为出口参数时,选项值的实际长度。对于setsockopt(),现选项的长度。

    返回值:

    成功执行时,返回0。失败返回-1,errno被设为以下的某个值 <wbr> <wbr>
    EBADF:sock不是有效的文件描述词
    EFAULT:optval指向的内存并非有效的进程空间
    EINVAL:在调用setsockopt()时,optlen无效
    ENOPROTOOPT:指定的协议层不能识别选项
    ENOTSOCK:sock描述的不是套接字

    level指定控制套接字的层次。可以取三种值:
    1)SOL_SOCKET:通用套接字选项.
    2)IPPROTO_IP:IP选项.
    3)IPPROTO_TCP:TCP选项. 
    optname指定控制的方式(选项的名称),我们下面详细解释 
    optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 
    Linux下getsockopt/setsockopt 函数说明

    // 接收缓冲区
    int nRecvBuf=32*1024;        //设置为32K
    setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
    //发送缓冲区
    int nSendBuf=32*1024;//设置为32K
    setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
    

    注意:
    当设置TCP套接口接收缓冲区的大小时,函数调用顺序是很重要的,因为TCP的窗口规模选项是在建立连接时用SYN与对方互换得到的。对于客户,SO_RCVBUF选项必须在connect之前设置;对于服务器,SO_RCVBUF选项必须在listen前设置

    相关文章

      网友评论

          本文标题:setsockopt

          本文链接:https://www.haomeiwen.com/subject/tzcekltx.html