Redis开源代码读书笔记八(anet模块)

anet模块主要为对通信API的抽象和封装。

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.

相关setsockopt参数可通过链接详细阅读


static void anetSetError(char *err, const char *fmt, ...)
设置错误提示(字符串)

static int _anetTcpServer(char *err, int port, char *bindaddr, int af, int backlog)
开始侦听服务
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值