代码大概是这样的
let s: Socket; //之前 查阅资料后发现不优雅 不发送 FIN 包 s.destroy(); //现在 使用 end 在销毁 s.end(() => s.destroy()); //现在这个 s 依旧没有立即销毁,还能收到数据,需要在等一会才会关闭
有没有好的解决方案
![]() | 1 ysc3839 2024-04-08 17:15:57 +08:00 via Android 谁说 socket.destroy() 不会发送 FIN 的?我抓包看了会发。 |
2 FishBear OP |
3 FishBear OP @ysc3839 https://stackoverflow.com/questions/9191587/how-to-disconnect-from-tcp-socket-in-nodejs 但调用时 socket.destroy ,客户端连接会在没有强行接收 FIN 包的情况下被破坏。最好的做法是 socket.destroy 尽可能避免致电。 |
![]() | 4 sujin190 2024-04-08 19:01:35 +08:00 via Android ![]() end 发送 fin 后,客户端暂时不给你回 fin2 而是继续发送数据,那你就是能继续收到数据的啊,就算客户端立刻闭,那已发送的数据就应该继续收完了,本来你就需要等 close 事件,没啥问题啊,否则你直接 destory 就好了 |
![]() | 5 rrfeng 2024-04-08 19:22:54 +08:00 tcp 四次挥手没学好? |
![]() | 6 ysc3839 2024-04-08 19:30:37 +08:00 via Android ![]() @FishBear 他说的也不是不发送 FIN ,而是不等对端发送 FIN 就关闭。 他也没有给出避免使用 socket.destroy() 的理由。具体用不用当然要看用途,比如你的客户端收到了一大堆错误数据,那用 socket.destroy() 关闭并没什么问题,难不成还只能用 socket.end() 然后等半天对方发完错误数据? |
7 sohusi 2024-04-08 19:59:45 +08:00 ![]() |
10 FishBear OP 找到了一个更合适的 api .destroySoon() |