当前位置: 首页 > 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.zskr.cn/news/2056.html

相关文章:

  • Delphi TStringGrid控件学习笔记
  • Java第一次实验
  • HCIP回顾— BGP经典实验详解
  • 千靶日记-0002
  • 3.4 页面替换算法 Page Replacement Algorithms
  • Tekla坐标定位插件源码
  • K8S常见的微服务中间件部署之strom
  • 三种语句
  • ECT-OS-JiuHuaShan框架:自然规律的具象化智能体(附《易经》类比解析)
  • 力扣第5题最长回文子串
  • 用 Python 和 PaddleOCR 进行验证码识别
  • UniApp 自定义tabBar
  • 判断左手坐标系和右手坐标系的方法
  • 题解:P2012 拯救世界2
  • 题解:CF348C Subset Sums
  • 题解:CF2118D1 Red Light, Green Light (Easy version)
  • 27届春招备战一轮复习--第五期
  • 阅读方式
  • 软件测试工程师的职业天花板在哪里?如何突破?
  • 长乐一中 CSP-S 2025 提高级模拟赛 Day2
  • 费用流
  • [豪の学习笔记] 软考中级备考 基础复习#6
  • Ubuntu 卸载 Firefox 浏览器
  • ansible剧本
  • Ubuntu 安装 Google Chrome
  • npx playwright install chromium 安装失败,如何离线安装
  • Power BI制作指标达成跟踪器
  • 一个基于 .NET 开源、轻便的 Windows 优化工具,适用于 Win7 - Win11 最新版的优化!
  • 两种求快速幂的方法
  • 杂题20250909-