36 网络相关函数(四)——live555源码阅读(四)网络
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 关闭套接口
closesocket
是winsock.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_RCVBUF
和SO_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_RCVBU
F选项必须在listen
前设置。