anet模块主要为对通信API的抽象和封装。
==》支持V4/V6版本的Tcp Socket服务
==》支持阻塞及非阻塞式TCP连接
==》支持Tcp No Delay机制
==》支持Tcp Keep Alive机制
==》支持Tcp 发送超时机制
--> anetTcpGenericConnect(err,addr,port,NULL,ANET_CONNECT_NONE)
建立通常的TCP连接
int anetTcpNonBlockConnect(char *err, char *addr, int port);
--> anetTcpGenericConnect(err,addr,port,NULL,ANET_CONNECT_NONBLOCK)
建立非阻塞式TCP连接
int anetTcpNonBlockBindConnect(char *err, char *addr, int port, char *source_addr);
--> anetTcpGenericConnect(err,addr,port,source_addr,ANET_CONNECT_NONBLOCK)
建立非阻塞式绑定TCP连接
int anetTcpNonBlockBestEffortBindConnect(char *err, char *addr, int port, char *source_addr);
--> anetTcpGenericConnect(err,addr,port,source_addr,ANET_CONNECT_NONBLOCK|ANET_CONNECT_BE_BINDING)
建立非阻塞式最大努力尝试绑定TCP连接
int anetUnixConnect(char *err, char *path);
--> anetUnixGenericConnect(err,path,ANET_CONNECT_NONE)
建立UNIX domain sockets连接(本地)
int anetUnixNonBlockConnect(char *err, char *path);
--> anetUnixGenericConnect(err,path,ANET_CONNECT_NONBLOCK)
建立非阻塞式UNIX domain sockets连接(本地)
int anetResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len);
--> anetGenericResolve(err,host,ipbuf,ipbuf_len,ANET_NONE)
获取主机名的IP地址
int anetResolveIP(char *err, char *host, char *ipbuf, size_t ipbuf_len);
--> anetGenericResolve(err,host,ipbuf,ipbuf_len,ANET_IP_ONLY)
获取数字串地址的IP地址
int anetTcpAccept(char *err, int serversock, char *ip, size_t ip_len, int *port);
--> anetGenericAccept
TCP Socket等待连接,返回IP和端口值
int anetUnixAccept(char *err, int serversock);
--> anetGenericAccept
UNIX domain Socket等待连接
int anetNonBlock(char *err, int fd);
--> anetSetBlock(err,fd,1)
设置sokect句柄阻塞式模式
int anetBlock(char *err, int fd);
--> anetSetBlock(err,fd,0)
设置sokect句柄非阻塞式模式
int anetEnableTcpNoDelay(char *err, int fd);
--> anetSetTcpNoDelay(err, fd, 1)
使能TcpNoDelay设置
int anetDisableTcpNoDelay(char *err, int fd);
--> anetSetTcpNoDelay(err, fd, 0)
非使能TcpNoDelay设置
int anetTcpServer(char *err, int port, char *bindaddr, int backlog);
--> _anetTcpServer(err, port, bindaddr, AF_INET, backlog)
启动TcpServer
int anetTcp6Server(char *err, int port, char *bindaddr, int backlog);
--> _anetTcpServer(err, port, bindaddr, AF_INET6, backlog)
启动Tcp6Server
int anetUnixServer(char *err, char *path, mode_t perm, int backlog);
--> anetCreateSocket
--> anetSetReuseAddr
--> anetListen
启动UnixServer
int anetRead(int fd, char *buf, int count);
从fd获取count字节到buf里
int anetWrite(int fd, char *buf, int count);
从buf里面写count字节到fd
int anetTcpKeepAlive(char *err, int fd);
int anetSendTimeout(char *err, int fd, long long ms);
设置超时发送时间限制(0取消超时机制)
int anetPeerToString(int fd, char *ip, size_t ip_len, int *port);
获取Peer地址信息(比如:IP和端口号,或者unixsocket)
linux socket 的keepllive属性来检测网络连接的状态,TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT都是在tcp.h中定义。
比如:
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
int anetKeepAlive(char *err, int fd, int interval);
设置L4层TCP网络连接状态检测机制
int anetSockName(int fd, char *ip, size_t ip_len, int *port);
获取当前socket句柄IP和端口
建立Unix本地连接
static int anetTcpGenericConnect(char *err, char *addr, int port, char *source_addr, int flags)
建立TCP连接
int anetGenericResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len, int flags)
获取主机名的IP地址(支持地址为数字串)
static int anetGenericAccept(char *err, int s, struct sockaddr *sa, socklen_t *len)
等待连接(阻塞或者非阻塞模式,不出错误就一直等待)
int anetSetBlock(char *err, int fd, int non_block)
设置非阻塞机制启动状态
static int anetSetTcpNoDelay(char *err, int fd, int val)
设置TcpNoDelay机制启用状态(Nagle算法)
static int anetCreateSocket(char *err, int domain)
创建一个TCP套接口
static int anetSetReuseAddr(char *err, int fd)
设置Socket属性可以重复绑定
设置错误提示(字符串)
static int _anetTcpServer(char *err, int port, char *bindaddr, int af, int backlog)
开始侦听服务
anet功能特性
==》支持Unix Domain Socket服务==》支持V4/V6版本的Tcp Socket服务
==》支持阻塞及非阻塞式TCP连接
==》支持Tcp No Delay机制
==》支持Tcp Keep Alive机制
==》支持Tcp 发送超时机制
anet基本接口
int anetTcpConnect(char *err, char *addr, int port);--> anetTcpGenericConnect(err,addr,port,NULL,ANET_CONNECT_NONE)
建立通常的TCP连接
int anetTcpNonBlockConnect(char *err, char *addr, int port);
--> anetTcpGenericConnect(err,addr,port,NULL,ANET_CONNECT_NONBLOCK)
建立非阻塞式TCP连接
int anetTcpNonBlockBindConnect(char *err, char *addr, int port, char *source_addr);
--> anetTcpGenericConnect(err,addr,port,source_addr,ANET_CONNECT_NONBLOCK)
建立非阻塞式绑定TCP连接
int anetTcpNonBlockBestEffortBindConnect(char *err, char *addr, int port, char *source_addr);
--> anetTcpGenericConnect(err,addr,port,source_addr,ANET_CONNECT_NONBLOCK|ANET_CONNECT_BE_BINDING)
建立非阻塞式最大努力尝试绑定TCP连接
int anetUnixConnect(char *err, char *path);
--> anetUnixGenericConnect(err,path,ANET_CONNECT_NONE)
建立UNIX domain sockets连接(本地)
int anetUnixNonBlockConnect(char *err, char *path);
--> anetUnixGenericConnect(err,path,ANET_CONNECT_NONBLOCK)
建立非阻塞式UNIX domain sockets连接(本地)
int anetResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len);
--> anetGenericResolve(err,host,ipbuf,ipbuf_len,ANET_NONE)
获取主机名的IP地址
int anetResolveIP(char *err, char *host, char *ipbuf, size_t ipbuf_len);
--> anetGenericResolve(err,host,ipbuf,ipbuf_len,ANET_IP_ONLY)
获取数字串地址的IP地址
int anetTcpAccept(char *err, int serversock, char *ip, size_t ip_len, int *port);
--> anetGenericAccept
TCP Socket等待连接,返回IP和端口值
int anetUnixAccept(char *err, int serversock);
--> anetGenericAccept
UNIX domain Socket等待连接
int anetNonBlock(char *err, int fd);
--> anetSetBlock(err,fd,1)
设置sokect句柄阻塞式模式
int anetBlock(char *err, int fd);
--> anetSetBlock(err,fd,0)
设置sokect句柄非阻塞式模式
int anetEnableTcpNoDelay(char *err, int fd);
--> anetSetTcpNoDelay(err, fd, 1)
使能TcpNoDelay设置
int anetDisableTcpNoDelay(char *err, int fd);
--> anetSetTcpNoDelay(err, fd, 0)
非使能TcpNoDelay设置
int anetTcpServer(char *err, int port, char *bindaddr, int backlog);
--> _anetTcpServer(err, port, bindaddr, AF_INET, backlog)
启动TcpServer
int anetTcp6Server(char *err, int port, char *bindaddr, int backlog);
--> _anetTcpServer(err, port, bindaddr, AF_INET6, backlog)
启动Tcp6Server
int anetUnixServer(char *err, char *path, mode_t perm, int backlog);
--> anetCreateSocket
--> anetSetReuseAddr
--> anetListen
启动UnixServer
int anetRead(int fd, char *buf, int count);
从fd获取count字节到buf里
int anetWrite(int fd, char *buf, int count);
从buf里面写count字节到fd
int anetTcpKeepAlive(char *err, int fd);
int anetSendTimeout(char *err, int fd, long long ms);
设置超时发送时间限制(0取消超时机制)
int anetPeerToString(int fd, char *ip, size_t ip_len, int *port);
获取Peer地址信息(比如:IP和端口号,或者unixsocket)
linux socket 的keepllive属性来检测网络连接的状态,TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT都是在tcp.h中定义。
比如:
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
int anetKeepAlive(char *err, int fd, int interval);
设置L4层TCP网络连接状态检测机制
int anetSockName(int fd, char *ip, size_t ip_len, int *port);
获取当前socket句柄IP和端口
anet内部接口
int anetUnixGenericConnect(char *err, char *path, int flags)建立Unix本地连接
static int anetTcpGenericConnect(char *err, char *addr, int port, char *source_addr, int flags)
建立TCP连接
int anetGenericResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len, int flags)
获取主机名的IP地址(支持地址为数字串)
static int anetGenericAccept(char *err, int s, struct sockaddr *sa, socklen_t *len)
等待连接(阻塞或者非阻塞模式,不出错误就一直等待)
int anetSetBlock(char *err, int fd, int non_block)
设置非阻塞机制启动状态
static int anetSetTcpNoDelay(char *err, int fd, int val)
设置TcpNoDelay机制启用状态(Nagle算法)
static int anetCreateSocket(char *err, int domain)
创建一个TCP套接口
static int anetSetReuseAddr(char *err, int fd)
设置Socket属性可以重复绑定
SO_REUSEADDR
Indicates that the rules used in validating addresses supplied
in a bind(2) call should allow reuse of local addresses. For
AF_INET sockets this means that a socket may bind, except when
there is an active listening socket bound to the address.
When the listening socket is bound to INADDR_ANY with a
specific port then it is not possible to bind to this port for
any local address. Argument is an integer boolean flag.
设置错误提示(字符串)
static int _anetTcpServer(char *err, int port, char *bindaddr, int af, int backlog)
开始侦听服务