当前位置: 首页 > news >正文

RST报文段的意义

客户端代码,服务端代码如下

客户端代码
import socketSERVER_ADDR = '127.0.0.1'
PORT        = 18000
CHUNK_SIZE  = 1024 * 4def main():""" echo 客户端: 基于 AF_INET domain and TCP type 的 socket """# socket -> s.connect -> s.sendall -> s.shutdown -> loop s.recv -> s.closewith socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.connect((SERVER_ADDR, PORT))s.sendall(b"hello")s.shutdown(socket.SHUT_WR)  # if without this line code, the server and client will be deadlocked!response = b""while data := s.recv(CHUNK_SIZE):response += dataprint(response.decode())if __name__ == "__main__":main()
服务端代码
import socketHOST = '0.0.0.0'
PORT = 18000
BACKLOG = 16
CHUNK_SIZE = 1024 * 4def handle_client(conn, addr):with conn:print(f"{addr[0]}:{addr[1]}", flush=True, end=' ')request = b""while data := conn.recv(CHUNK_SIZE):request += dataprint(request.decode(), flush=True)conn.sendall(request)def main():""" echo 服务器: 基于 AF_INET domain and TCP type 的 socket """# socket -> s.bind -> s.listen -> s.accept -> s.closewith socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.bind((HOST, PORT))s.listen(BACKLOG)print(f"Listening on {HOST}:{PORT}\n", flush=True) try:while True:conn, addr = s.accept()handle_client(conn, addr)except KeyboardInterrupt:print("\nServer shutting down...")if __name__ == "__main__":main()

运行结果如下

image

删除客户端一行代码就会发生死锁,如下

s.shutdown(socket.SHUT_WR)  # if without this line code, the server and client will be deadlocked!

死锁发生的时候,按下Ctrl + C 结束客户端的运行,则有以下过程

  1. 客户端的内核开始清理客户端的socket资源,首先向服务端发送一个FIN报文
  2. 服务端内核收到FIN报文,然后服务端从recv返回,打印数据,然后sendall发送数据
  3. 客户端收到服务端发送的数据,不处理,向客户端发送RST报文,表示客户端的socket已经不存在,不要再发送数据了
  4. 服务端收到RST报文,关闭conn socket,重新回到main函数的while循环中
http://www.wxhsa.cn/company.asp?id=723

相关文章:

  • Delphi TStringGrid控件学习笔记
  • 你可能不需要WebSocket-服务器发送事件的简单力量
  • JS 定时器 点击简书 button 加载更多 控制台触发
  • Oops! internal error 1341 occurred.
  • navicat查看mysql数据库大小
  • MyNetty Normal 规格池化内存分配在高并发场景的应用探讨
  • mongodb 慢查询模拟
  • Java第一次实验
  • HCIP回顾— BGP经典实验详解
  • 逆波兰表达式求值+滑动窗口最大值
  • 84. 柱状图中最大的矩形
  • 前k个高频元素
  • 千靶日记-0002
  • [序列化/JSON/Java/Utils] JACKSON 概述
  • 完全弹性碰撞公式推导
  • reLeetCode 热题 100-2 字母异位词分组 扩展 - MKT
  • 第6篇、Kafka 高级实战:生产者路由与消费者管理
  • 3.4 页面替换算法 Page Replacement Algorithms
  • 学习心得
  • 反射对JVM的影响
  • reLeetCode 热题 100-2 字母异位词分组 - MKT
  • 分布式id
  • ipad装windows系统模拟器
  • [Java/SQL/Utils] SQL注释清除工具:SqlCommentStripper
  • 大模型面试题
  • CF2021D 题解 | dp
  • Caffeine缓存
  • Spark面试题清单
  • RocketMQ知识点梳理
  • Tekla坐标定位插件源码