#4145·fiber

[建议]: 提供有效的 TCP 断开处理程序

作者: bincooo创建于 2026年3月16日更新于 2026年3月16日
标签✏️ Featurev3📝 Proposal
  • 特性建议说明

首先,我要感谢开发人员的努力。 为了更好地支持流/流处理,您能否为 TCP 断开添加一个监听执行? 我遇到过许多这样的情况,前端积极断开请求,但后端未能及时发现. 只有当后端任务完成或试图向流写入时,才会发布读/写例外.

QQ 与 Express API 对齐

我已经作了粗略的落实,我不确定这个项目是否有相关的落实。 我想提出一项建议:

开始 软件包 v1

导入( E) 内容 "错误" "净" "惊叹" "时间"

"GitHub.com/gofiber/fiber/v3" (中文(简体) ). (中文(简体) ).

类型 中止 Ctx struct { 父环境。 A. 背景情况 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}做得不错 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080} 错误 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

//创建一个监听客户端断开的 上下文 func newAbort(ctx 纤维). Ctx) (中文(简体) ). 上下文 (中文(简体) ). 取消Func){ cctx := & abortCtx{ (中文(简体) ). 父目录 : ctx. context (), 完成: make(chan struct-), {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

循环 := 真实 取消 := func (){ 循环=虚假 选择{ 大小写 < cctx.done: //已经关闭. 默认 : cctx.err=上下文 (中文(简体) ). 已取消 关闭( cctx.done) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

c: = make(chan 字节, 1) conn:=ctx. requestCtx (. Conn () =. 开始 func () { 循环 { 如果关闭( 关闭) { 环 < 1 循环=虚假 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 时间。 睡觉(时间). 毫秒 * 500) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? • ()

//后台轮询被抛弃 开始 func () { 选择{ 实例 < cctx.parent.Done (): 选择{ 大小写 < cctx.done: 默认 : cctx.err = cctx. parent. (中文(简体) ). 错误( ) 关闭( cctx.done) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回时

大小写 <-ch: 选择{ 大小写 < cctx.done: 默认 : cctx.err=上下文 (中文(简体) ). 已取消 关闭( cctx.done) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回时

大小写 < cctx.done: 返回时 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? • ()

返回 cctx, 取消 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func (c *abortCtx) 最后期限 (时间). 时间、鸟儿){ 返回 c. parent. deadline () {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func (c *abortCtx) Done () <-chan struct *{ 返回 c. done 语句 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func (c *abortCtx) Err () 错误{ 选择{ 实例 <-c.done: 返回 c. err 数据 默认 : 返回为零 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func (c *abortCtx) 值(键有) 任何 { 返回 c. 家长。 值( 关键) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func isClosed (conn net. ) (中文(简体) ). 康恩) boul { //获取底层文件描述符. 原始康恩,OK:=康恩(syscall). Conn) (英语). 如果这样的话! 返回虚假 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

var 关闭的布尔 rc, 错误 := 生 Con. SyscallConn () 如果错误 ! = 无 { 返回虚假 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

=rc.read (func (fd uintptr)) bul { (法语). buf:= 成 ([]字节, 1)

MSG PEEK:
n, , ioer : = syscall. Recvrom (int(fd), buf, syscall. MSG PEEK syscall. MSG DONTWAIT) 互联网档案馆的存檔,存档日期2011-12-20. 如果n================================================================================================== (===================================================================================== (================================================ (==================== //欧洲法语国家组织:
关闭 = 真 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

如果错误。 i (ioer, syscall.ECONRESET) { (英语). 关闭 = 真 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

// EAAIN/EWOULDBLOCK = 没有数据但连接正常 返回真实 ) (中文(简体) ).

返回关闭 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


HTTP RFC 标准遵守情况

- 说吧

API 稳定

- 说吧

QQ 特性示例

开始
- 说吧

• 核对表: