V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
v2byy
V2EX  ›  程序员

当 socket 处于 receive 的 block 状态时,如何安全的关闭一个 socket 连接?

  •  
  •   v2byy · Jan 2, 2018 · 4552 views
    This topic created in 3040 days ago, the information mentioned may be changed or developed.
    比如:
    起一个线程建立 socket 连接之后,调 receive 来 block 当前线程,程序退出如何安全的关闭掉该 socket 连接呢?
    18 replies    2018-01-03 13:04:38 +08:00
    zj299792458
        1
    zj299792458  
       Jan 2, 2018 via iPhone
    程序都退出了,关一个 socket 还能有多危险……
    0Kelvin
        2
    0Kelvin  
       Jan 2, 2018
    写个 log 再关?
    v2byy
        3
    v2byy  
    OP
       Jan 2, 2018 via iPhone
    @zj299792458 抛个异常出来总不好吧
    wwqgtxx
        4
    wwqgtxx  
       Jan 2, 2018
    @v2byy 那就加个 try catch 呗
    v2byy
        5
    v2byy  
    OP
       Jan 2, 2018 via iPhone
    @0Kelvin 直接将线程 abort 掉?
    v2byy
        6
    v2byy  
    OP
       Jan 2, 2018 via iPhone
    @wwqgtxx 嗯,不知道有没有什么好方法……
    lifespy
        7
    lifespy  
       Jan 2, 2018
    .close
    veelog
        8
    veelog  
       Jan 2, 2018 via iPhone
    发个信号给线程,通知退出
    wwqgtxx
        9
    wwqgtxx  
       Jan 2, 2018
    试试在另一个线程去 close 这个 socket,这个取决于底层 API 实现,在有些实现中是可以这样干的
    firstway
        10
    firstway  
       Jan 3, 2018
    应该可以从另外线程 close,block 的这个可能会读到 EOF 或这异常(可能语言相关)。
    hjc4869
        11
    hjc4869  
       Jan 3, 2018 via iPhone
    双向 shutdown
    sjx95
        12
    sjx95  
       Jan 3, 2018
    不知道 lz 是什么语言哦,Java 的话 catch 一个 InterruptedException 就可以了,C 的话我不清楚,估计需要用 SIGINT 之类的?另外把 socket 存在一张表里面,直接 abort 线程然后从父线程关闭 socket 应该也可以。
    C++的话,我记得以前我好像是用的 asio 异步+lambda 表达式模拟的同步,平时用 io_service.run()阻塞线程,需要关闭的时候就在另一个线程调用 io_service.cancle()。其实也挺丑的。
    snnn
        13
    snnn  
       Jan 3, 2018 via Android
    任何线程都可以 shutdown 这个 socket。一旦这个 socket 被关闭,block 在 receive 那里的线程会继续往下走的
    sky2017
        14
    sky2017  
       Jan 3, 2018
    @snnn 对的,只要 socket 关闭,receive 会立刻出错返回
    janxin
        15
    janxin  
       Jan 3, 2018
    close socket 一般会出错或者异常,catch 或者处理一下即可。
    v2byy
        16
    v2byy  
    OP
       Jan 3, 2018 via iPhone
    @sjx95 现在就是 catch 了一下异常
    6ufq0VLZn0DDkL80
        17
    6ufq0VLZn0DDkL80  
       Jan 3, 2018
    receive 的时候挂个超时。
    6ufq0VLZn0DDkL80
        18
    6ufq0VLZn0DDkL80  
       Jan 3, 2018
    服务端在两处 close socket 是高危行为。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2510 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 03:57 · PVG 11:57 · LAX 20:57 · JFK 23:57
    ♥ Do have faith in what you're doing.