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

本文详细介绍了live555源码中的三个关键网络函数:createSocket用于创建socket套接口,closeSocket用于关闭套接口,setsockopt用于设置套接口选项。重点阐述了函数的实现细节及使用注意事项。

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

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

简介

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

7)createSocket创建socket方法

createSocket使用参数type创建一个相关类型的socket套接口。如果有相关定义,将为这个套接口添加”close on exec”执行时关闭属性。
注意,这个函数是static类型的,只在本文件(live555sourcecontrol\groupsock\GroupsockHelper.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_OPTINOSIP首部选项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_MAXSEGTCP最大数据段的大小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前设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值