Redisオープンソース読書ノート8(anetモジュール)

5341 ワード

anetモジュールは主に通信APIの抽象とパッケージである.
anet機能特性===Unix Domain Socketサービスをサポート
==』V 4/V 6対応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ソケットは接続待ちで、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)
Tcp 6サーバの起動
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);
L 4層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)
リスニングサービスを開始