目录
0.简介
上一篇已讲述了服务端整个工作流程,本篇大致分析一下客户端。客户端相对简单,它只负责一个连接,成功连接到服务端后,即可进行正常的数据交互。
和服务端相对应的,客户端代码由TcpClient类发起,TcpClient里包含一个Connector(回想一下Acceptor),等连接建立后,也是依赖TcpConnection类做大部分事情。
1.主动连接
客户端连接过程如下:
来看一下Connector::connect(), 先创建一个非阻塞的套接口,调用系统函数去连接服务端:
int sockets::connect(int sockfd, const struct sockaddr* addr)
{
return ::connect(sockfd, addr, static_cast<socklen_t>(sizeof(struct sockaddr_in6)));
}
如果正常返回(注意:此时连接还没有成功),则进入connecting() 函数,否则尝试重连或者直接关闭套接口。
void Connector::connect()
{
int sockfd = sockets::createNonblockingOrDie(serverAddr_.family());
int ret = sockets::connect(sockfd, serverAddr_.getSockAddr());
int savedErrno = (ret == 0) ? 0 : errno;
switch (savedErrno)
{
case 0:
case EIN