
现在让我们一起实现这个tcp协议的代码吧:
socket():创建套接字
bind():给套接字设置对应的ip和端口
listen():设置监听队列
accept():接收客户端连接
connect():发起连接
recv():接收数据
send():发送数据
代码:
服务器端:ser.c

服务器端持续接收客户端发送的数据,打印并向客户端发送ok
客户端:cli.c
代码:

客户端向服务器发送数据,并会接收服务器发送过来的ok
执行结果:

底层逻辑:
tcp特点之一面向连接的:
三次握手:就是 TCP 建立连接的过程,目的是让客户端和服务器双方都确认:对方的发送和接收能力正常,并且双方就初始序列号达成一致。
connect()之后会进行三次握手(发送三次报文)
服务端 客户端

(SYN和ACK是报文上的特殊标志位)
四次挥手:是 TCP 断开连接的过程。和建立连接需要"三次"不同,断开通常需要"四次"
当某一方调用 close(),内核就会自动发出 FIN 报文,触发四次挥手(发送四次报文)
服务端 客户端


listen(sockfd,5)
监听队列创建未完成握手队列和已完成握手队列,这里设置已完成握手队列大小(5)
完成三次握手,会从未完成进入已完成握手队列,再进行连接
c=accept()接收已完成握手队列中的连接,如果已完成握手队列为空,堵塞
recv()和send()本质是在各自缓冲区中完成的
服务端 客户端

发送方 send() 的数据经内核发送缓冲区和网络,到达接收方内核的接收缓冲区;接收方调用 recv(buf, len) 时,从该缓冲区拷贝最多 len 字节到 buf,实际拷贝多少取决于缓冲区中当前可读的字节数和 len 上限。
例子:
正常情况:
客户端发送hello,服务端设置一次接受五个字符,一次接受完,返回一个ok,客户端打印一个ok
客户端发送hello,服务端设置一次接受一个字符,返回共5个ok,客户端打印五个ok
但如果传输速度不够快,5个ok先传来2个,被rece(),打印2个ok;下次再执行recv()时,才会把剩下的3个ok打印
这就是本文的所有内容,感谢您的观看!