前言
我们开始学习网络编程,尽管接下来的速度会非常快,但是我还是希望事事具细。
首先我们以一个回射服务器来说说流程。
服务器部分
变量部分:
listenfd 监听字
connfd 链接字
childpid 服务器进程id
cliaddr 客户端套接字结构体 servaddr 服务端套接字结构体
函数部分:
socket 函数建立一个套接字 ,接收协议类型,返回一个套接字描述符这里是一个通配地址。
接着开始指定服务器套接字结构体的基本信息,协议,IP, 端口等。
bind 函数将服务器信息与套接字描述符绑定。
listen 函数开始监听这个服务器套接字,三次握手就再这里。
我们对与每一个链接都给他开一个进程处理信息。
accept 函数用来完成三路握手完成链接,获取客户端信息,然后返回这个全双工的信息链接字。
它接收信息并且回射。
客户端部分
这个客户端的功能是,从命令行接收一行字符发送给服务器,然后服务器回射给他。
创建一个TCP套接字,然后从命令行获取IP ,并且我们指定一个众所周知的端口,然后链接服务器。
正常终止:
首先客户端关闭套接字,向服务器发送一个FIN,服务器发送一个ACK 来回应。这是TCP链接终止的前半部分。
服务器套接字 CLOSE_WAIT
客户套接字 FIN_WAIT_2
接着服务器进程开始结束
服务器向客户端发送FIN
客户端回一个ACK
链接结束。
当服务器主机崩溃
首先TCP会一直尝试重新传送数据,当超过一定时间后,自动判定服务器崩溃结束
其次,如果是因为网络问题导致消息不可达,客户端收到不可达信息后自己关闭
我们可以通过超时,保活,心跳等手段来改善这个现象
当服务器主机崩溃后重启
当服务器崩溃时,客户端只要不主动发送数据它是不知道服务器崩溃的,当服务器再次重启时,之前的链接信息已经全部丢失,链接直接失效。