V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
labulaka521
V2EX  ›  程序员

请问如何可以在 golang 建立的 tcp 连接中在客户端主动断开时,让服务端不发送 FIN 包

  •  
  •   labulaka521 ·
    labulakalia · 2020-07-29 13:28:02 +08:00 via iPhone · 3020 次点击
    这是一个创建于 1571 天前的主题,其中的信息可能已经有所发展或是发生改变。
    难道是一直发送数据?
    21 条回复    2020-07-29 22:30:58 +08:00
    goofool
        1
    goofool  
       2020-07-29 13:50:39 +08:00
    那就不是 TCP 协议了
    nacosboy
        2
    nacosboy  
       2020-07-29 13:50:39 +08:00
    你可以让 client 主动发送个信号给 server,server 收到信号后 panic,就不会发 FIN 了
    ChristopherWu
        3
    ChristopherWu  
       2020-07-29 13:53:32 +08:00
    为什么要这么做?
    Ariver
        4
    Ariver  
       2020-07-29 13:54:31 +08:00
    先搞明白 tcp/ip
    yph007595
        5
    yph007595  
       2020-07-29 13:57:17 +08:00
    @barryzxb 优秀
    heijiaotuan
        6
    heijiaotuan  
       2020-07-29 14:00:21 +08:00
    客户端做一个假断开, 并且标记为可重用状态, 下一次有人用再断开上一个 socket.
    tempdban
        7
    tempdban  
       2020-07-29 14:01:36 +08:00 via Android
    楼上几个嘲讽楼主之前,是不是应该自己先看看 tcp 协议?
    @goofool

    @Ariver
    labulaka521
        8
    labulaka521  
    OP
       2020-07-29 14:46:25 +08:00
    讨论一个问题,何必这么咄咄逼人呢
    @goofool
    @ChristopherWu
    @Ariver
    我也想问什么这么做,大概是别人问我了吧
    tempdban
        9
    tempdban  
       2020-07-29 14:47:50 +08:00 via Android
    搜索了一下,golang 貌似可以半关闭的。
    https://stackoverflow.com/questions/23879000/net-tcpconn-allowing-write-after-fin-packet
    这里您要关注一下,client 半关闭后收到 server 的 payload 会怎么处理,有可能是 rst,也有可能可以正常处理。
    goofool
        10
    goofool  
       2020-07-29 14:48:07 +08:00 via Android   ❤️ 1
    @tempdban 这也叫嘲讽?大棚里长大的么
    labulaka521
        11
    labulaka521  
    OP
       2020-07-29 14:51:21 +08:00
    使用 CloseWrite 即可
    labulaka521
        12
    labulaka521  
    OP
       2020-07-29 14:52:24 +08:00
    @goofool 可能你没理解我什么意思
    别吵 此贴 终止 别回复了
    tempdban
        13
    tempdban  
       2020-07-29 14:54:53 +08:00 via Android
    @goofool 抱歉嘲讽是我用词不当,主要是针对下面的那位朋友,但是你 tcp 是要好好学学的
    LANB0
        14
    LANB0  
       2020-07-29 14:57:26 +08:00
    C 可以配置 SO_LINGER 来强制 reset,golang 没理由不能
    ChristopherWu
        15
    ChristopherWu  
       2020-07-29 15:33:18 +08:00
    @labulaka521 一个问题,先要有目标场景啊。有可能你说的做法并不是解决你这个问题的最佳办法。
    如果你单纯只是想知道怎么做,直接说只是好奇,就好了——这种场景下,方法就更多了。
    wangritian
        16
    wangritian  
       2020-07-29 15:45:25 +08:00
    好奇使用场景,学习一下
    also24
        17
    also24  
       2020-07-29 15:49:01 +08:00
    labulaka521
        18
    labulaka521  
    OP
       2020-07-29 16:02:50 +08:00
    @ChristopherWu 别人问我的 我纯属好奇问一下

    @wangritian 我也不知道这有什么使用场景
    labulaka521
        19
    labulaka521  
    OP
       2020-07-29 16:07:04 +08:00
    @also24 学习了
    labulaka521
        20
    labulaka521  
    OP
       2020-07-29 16:12:56 +08:00
    @also24 这个真有趣 hhh
    Les1ie
        21
    Les1ie  
       2020-07-29 22:30:58 +08:00
    场景有可能是大范围的 TCP 扫描 半开放的扫描只需要发送 syn 等待接收 ack,如果本地关闭了连接,内核可能会发送一个 fin,占用带宽,所以需要阻止系统内核发送 fin
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:30 · PVG 22:30 · LAX 06:30 · JFK 09:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.