讨论一下 net.socket 关闭问题

260 天前
 FishBear

代码大概是这样的

let s: Socket;

//之前 查阅资料后发现不优雅 不发送 FIN 包
s.destroy();

//现在 使用 end 在销毁
s.end(() => s.destroy());

//现在这个 s 依旧没有立即销毁,还能收到数据,需要在等一会才会关闭

有没有好的解决方案

1488 次点击
所在节点    Node.js
10 条回复
ysc3839
260 天前
谁说 socket.destroy() 不会发送 FIN 的?我抓包看了会发。
FishBear
260 天前
@ysc3839 那就是我不够严谨了 我在谷歌搜了别人的回答是这么说的..

但是发了 destroy 之后 这个连接还开着 这就有点麻烦了
FishBear
260 天前
@ysc3839 https://stackoverflow.com/questions/9191587/how-to-disconnect-from-tcp-socket-in-nodejs
但调用时 socket.destroy ,客户端连接会在没有强行接收 FIN 包的情况下被破坏。最好的做法是 socket.destroy 尽可能避免致电。
sujin190
260 天前
end 发送 fin 后,客户端暂时不给你回 fin2 而是继续发送数据,那你就是能继续收到数据的啊,就算客户端立刻关闭,那已发送的数据就应该继续收完了,本来你就需要等 close 事件,没啥问题啊,否则你直接 destory 就好了
rrfeng
260 天前
tcp 四次挥手没学好?
ysc3839
260 天前
@FishBear
他说的也不是不发送 FIN ,而是不等对端发送 FIN 就关闭。
他也没有给出避免使用 socket.destroy() 的理由。具体用不用当然要看用途,比如你的客户端收到了一大堆错误数据,那用 socket.destroy() 关闭并没什么问题,难不成还只能用 socket.end() 然后等半天对方发完错误数据?
sohusi
260 天前
FishBear
260 天前
@sohusi 我试试。还没发现这个 api
FishBear
260 天前
@sohusi 我觉得你是对的 这个 api 非常有用 可以快速的关闭这个连接 并且提醒对方也关闭这个连接
FishBear
260 天前
找到了一个更合适的 api .destroySoon()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1030670

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX