开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 24 天,点击查看活动详情。
一、TCP通信流程分析
-
server:
-
socket()创建socket -
bind()绑定服务器地址结构 -
listen()设置监听上限 -
accept()阻塞监听客户端连接 -
read(fd)读socket获取客户端数据 -
小--大写
toupper() -
write(fd) -
close();
-
-
client:
-
socket()创建socket -
connect();与服务器建立连接 -
write()写数据到 socket -
read()读转换后的数据。 -
显示读取结果
-
close()
-
网络通信流程图
二、握手
三次握手
主动发起连接请求端,发送 SYN 标志位,请求建立连接。 携带序号号、数据字节数(0)、滑动窗口大小。
被动接受连接请求端,发送 ACK 标志位,同时携带 SYN 请求标志位。携带序号、确认序号、数据字节数(0)、滑动窗口大小。
主动发起连接请求端,发送 ACK 标志位,应答服务器连接请求。携带确认序号。
四次挥手
主动关闭连接请求端, 发送 FIN 标志位。
被动关闭连接请求端, 应答 ACK 标志位。 ----- 半关闭完成。
被动关闭连接请求端, 发送 FIN 标志位。
主动关闭连接请求端, 应答 ACK 标志位。 ----- 连接全部关闭
TCP协议握手示意图
滑动窗口
发送给连接对端,本端的缓冲区大小(实时),保证数据不会丢失。
三、错误处理函数
封装目的: 在 server.c 编程过程中突出逻辑,将出错处理与逻辑分开,可以直接跳转man手册。
-
【wrap.c】
-
存放网络通信相关常用 自定义函数
-
命名方式:系统调用函数首字符大写, 方便查看man手册
如:Listen()、Accept();
-
函数功能:调用系统调用函数,处理出错场景。
-
在 server.c 和 client.c 中调用 自定义函数
-
联合编译 server.c 和 wrap.c 生成 server
client.c 和 wrap.c 生成 client
-
四、read函数
-
readn:读 N 个字节
-
readline:读一行
-
read 函数的返回值:
-
> 0实际读到的字节数 -
= 0已经读到结尾(对端已经关闭)【 !重 !点 !】 -
-1应进一步判断errno的值:errno = EAGAIN or EWOULDBLOCK: 设置了非阻塞方式 读。 没有数据到达。
errno = EINTR 慢速系统调用被 中断。
errno = “其他情况” 异常。
-