• 36 网络相关函数(四)——live555源码阅读(四)网络


    36 网络相关函数(四)——live555源码阅读(四)网络

    本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
    本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

    简介

    网络相关函数是一系列用于操作网络数据的函数。在多个文件中都有相关的函数的定义。还有一些函数是系统socket API相关函数,就不提了。
       这一系列的函数大多有一个特点,需要一个UsageEnvironmet&型的参数。
       这些方法大多在live555sourcecontrolgroupsockincludeGroupsockHelper.hh中声明。

    7)createSocket创建socket方法

    createSocket使用参数type创建一个相关类型的socket套接口。如果有相关定义,将为这个套接口添加”close on exec”执行时关闭属性。
    注意,这个函数是static类型的,只在本文件(live555sourcecontrolgroupsockGroupsockHelper.cpp)内使用。

    // type socket类型,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等
    static int createSocket(int type) {
        // Call "socket()" to create a (IPv4) socket of the specified type.
        // 调用“socket()创建一个(IPv4)指定类型的套接字。
        // But also set it to have the 'close on exec' property (if we can)
        // 还设置它具有“执行exec时关闭"属性(如果可以)
        int sock;
    
    #ifdef SOCK_CLOEXEC
        sock = socket(AF_INET, type|SOCK_CLOEXEC, 0);
        if (sock != -1 || errno != EINVAL) return sock;
        // An "errno" of EINVAL likely means that the system wasn't happy with the SOCK_CLOEXEC; fall through and try again without it:
    #endif
    
        sock = socket(AF_INET, type, 0);
    #ifdef FD_CLOEXEC
        if (sock != -1) fcntl(sock, F_SETFD, FD_CLOEXEC);
    #endif
        return sock;
    }
    

    8)closeSocket 关闭套接口

    closesocketwinsock.h中声明的函数,用于关闭一个套接口

    #define closeSocket closesocket     //关闭socket函数
    

    linux/unix等系统下,被替换为close函数

    #define closeSocket close   //关闭socket
    

    9)setsockopt 设置socket套接口选项

    这个函数是一个socket API函数,还有一个对应的getsockopt函数。在这里简单提一下。
    函数说明:用于任意类型、任意状态套接口的设置选项值。选项可能存在于多层协议中,它们总会出现在最上面的套接字层。当操作套接字选项时,选项位于的层和选项的名称必须给出。为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET。为了操作其它层的选项,控制选项的合适协议号必须给出。例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP

    函数原型:

        int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
    

    参数说明:

    • sockfd:标识一个套接口的描述字。
    • level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
    • optname:需设置的选项。
    • optval:指针,指向存放选项待设置的新值的缓冲区。
    • optlen:optval缓冲区长度。
    选项名称说明数据类型
      SOL_SOCKET  
    SO_BROADCAST 允许发送广播数据 int
    SO_DEBUG 允许调试 int
    SO_DONTROUTE 不查找路由 int
    SO_ERROR 获得套接字错误 int
    SO_KEEPALIVE 保持连接 int
    SO_LINGER 延迟关闭连接 structlinger
    SO_OOBINLINE 带外数据放入正常数据流 int
    SO_RCVBUF 接收缓冲区大小 int
    SO_SNDBUF 发送缓冲区大小 int
    SO_RCVLOWAT 接收缓冲区下限 int
    SO_SNDLOWAT 发送缓冲区下限 int
    SO_RCVTIMEO 接收超时 structtimeval
    SO_SNDTIMEO 发送超时 structtimeval
    SO_REUSERADDR 允许重用本地地址和端口 int
    SO_TYPE 获得套接字类型 int
    SO_BSDCOMPAT 与BSD系统兼容 int
      IPPROTO_IP  
    IP_HDRINCL 在数据包中包含IP首部 int
    IP_OPTINOS IP首部选项 int
    IP_TOS 服务类型  
    IP_MULTICAST_TTL 设置多播的TTL值  
    IP_MULTICAST_IF 获取或设置多播接口  
    IP_MULTICAST_LOOP 禁止多播数据回送到本地loop接口  
    IP_ADD_MEMBERSHIP 将指定的接口加入多播  
    IP_DROP_MEMBERSHIP 退出多播组  
    IP_TTL 生存时间 int
      IPPRO_TCP  
    TCP_MAXSEG TCP最大数据段的大小 int
    TCP_NODELAY 不使用Nagle算法 int

    返回说明:

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

    SO_RCVBUFSO_SNDBUF每个套接口都有一个发送缓冲区和一个接收缓冲区,使用这两个套接口选项可以改变缺省缓冲区大小。

    // 接收缓冲区
    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前设置。

  • 相关阅读:
    关于 L3 缓存行 cacheLIne 的研究!还是对程序有举足轻重的作用!
    所谓的科学,根本就没有解决问题的根本。如框架,框架再好,也需要内容。
    编译器开发,手动把汇编转 机器码
    测试HTML
    神奇的经历,顶上去保证上帝保佑你!!!!!
    ECS框架研究 ,unity 以及缓存行的研究
    AVX 指令详解 ,还有SSE指令
    关于 Visual Studio 2017 ,或2019 ,Installer 没检测到已安装的程序.以及C++ 创建项目失败
    TCP 协议 精解
    opc 相关组件
  • 原文地址:https://www.cnblogs.com/oloroso/p/4724040.html
Copyright © 2020-2023  润新知