V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
FishBear
V2EX  ›  Node.js

讨论一下 net.socket 关闭问题

  •  
  •   FishBear · 21 天前 · 890 次点击

    代码大概是这样的

    let s: Socket;
    
    //之前 查阅资料后发现不优雅 不发送 FIN 包
    s.destroy();
    
    //现在 使用 end 在销毁
    s.end(() => s.destroy());
    
    //现在这个 s 依旧没有立即销毁,还能收到数据,需要在等一会才会关闭
    

    有没有好的解决方案

    第 1 条附言  ·  20 天前
    destroySoon 解决了我的问题
    10 条回复    2024-04-09 15:11:05 +08:00
    ysc3839
        1
    ysc3839  
       21 天前 via Android
    谁说 socket.destroy() 不会发送 FIN 的?我抓包看了会发。
    FishBear
        2
    FishBear  
    OP
       21 天前
    @ysc3839 那就是我不够严谨了 我在谷歌搜了别人的回答是这么说的..

    但是发了 destroy 之后 这个连接还开着 这就有点麻烦了
    FishBear
        3
    FishBear  
    OP
       21 天前
    @ysc3839 https://stackoverflow.com/questions/9191587/how-to-disconnect-from-tcp-socket-in-nodejs
    但调用时 socket.destroy ,客户端连接会在没有强行接收 FIN 包的情况下被破坏。最好的做法是 socket.destroy 尽可能避免致电。
    sujin190
        4
    sujin190  
       21 天前 via Android   ❤️ 1
    end 发送 fin 后,客户端暂时不给你回 fin2 而是继续发送数据,那你就是能继续收到数据的啊,就算客户端立刻关闭,那已发送的数据就应该继续收完了,本来你就需要等 close 事件,没啥问题啊,否则你直接 destory 就好了
    rrfeng
        5
    rrfeng  
       21 天前
    tcp 四次挥手没学好?
    ysc3839
        6
    ysc3839  
       21 天前 via Android   ❤️ 1
    @FishBear
    他说的也不是不发送 FIN ,而是不等对端发送 FIN 就关闭。
    他也没有给出避免使用 socket.destroy() 的理由。具体用不用当然要看用途,比如你的客户端收到了一大堆错误数据,那用 socket.destroy() 关闭并没什么问题,难不成还只能用 socket.end() 然后等半天对方发完错误数据?
    sohusi
        7
    sohusi  
       21 天前   ❤️ 1
    FishBear
        8
    FishBear  
    OP
       21 天前 via iPad
    @sohusi 我试试。还没发现这个 api
    FishBear
        9
    FishBear  
    OP
       21 天前
    @sohusi 我觉得你是对的 这个 api 非常有用 可以快速的关闭这个连接 并且提醒对方也关闭这个连接
    FishBear
        10
    FishBear  
    OP
       20 天前
    找到了一个更合适的 api .destroySoon()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   931 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:20 · PVG 04:20 · LAX 13:20 · JFK 16:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.