V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
v2byy
V2EX  ›  程序员

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

  •  
  •   v2byy · 2018-01-02 17:55:05 +08:00 · 3997 次点击
    这是一个创建于 2547 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如:
    起一个线程建立 socket 连接之后,调 receive 来 block 当前线程,程序退出如何安全的关闭掉该 socket 连接呢?
    18 条回复    2018-01-03 13:04:38 +08:00
    zj299792458
        1
    zj299792458  
       2018-01-02 18:09:31 +08:00 via iPhone
    程序都退出了,关一个 socket 还能有多危险……
    0Kelvin
        2
    0Kelvin  
       2018-01-02 19:30:45 +08:00
    写个 log 再关?
    v2byy
        3
    v2byy  
    OP
       2018-01-02 20:04:45 +08:00 via iPhone
    @zj299792458 抛个异常出来总不好吧
    wwqgtxx
        4
    wwqgtxx  
       2018-01-02 20:13:30 +08:00
    @v2byy 那就加个 try catch 呗
    v2byy
        5
    v2byy  
    OP
       2018-01-02 20:15:11 +08:00 via iPhone
    @0Kelvin 直接将线程 abort 掉?
    v2byy
        6
    v2byy  
    OP
       2018-01-02 20:16:09 +08:00 via iPhone
    @wwqgtxx 嗯,不知道有没有什么好方法……
    lifespy
        7
    lifespy  
       2018-01-02 20:56:21 +08:00
    .close
    veelog
        8
    veelog  
       2018-01-02 21:00:07 +08:00 via iPhone
    发个信号给线程,通知退出
    wwqgtxx
        9
    wwqgtxx  
       2018-01-02 23:39:24 +08:00
    试试在另一个线程去 close 这个 socket,这个取决于底层 API 实现,在有些实现中是可以这样干的
    firstway
        10
    firstway  
       2018-01-03 02:26:01 +08:00
    应该可以从另外线程 close,block 的这个可能会读到 EOF 或这异常(可能语言相关)。
    hjc4869
        11
    hjc4869  
       2018-01-03 03:07:24 +08:00 via iPhone
    双向 shutdown
    sjx95
        12
    sjx95  
       2018-01-03 06:41:19 +08:00
    不知道 lz 是什么语言哦,Java 的话 catch 一个 InterruptedException 就可以了,C 的话我不清楚,估计需要用 SIGINT 之类的?另外把 socket 存在一张表里面,直接 abort 线程然后从父线程关闭 socket 应该也可以。
    C++的话,我记得以前我好像是用的 asio 异步+lambda 表达式模拟的同步,平时用 io_service.run()阻塞线程,需要关闭的时候就在另一个线程调用 io_service.cancle()。其实也挺丑的。
    snnn
        13
    snnn  
       2018-01-03 07:43:35 +08:00 via Android
    任何线程都可以 shutdown 这个 socket。一旦这个 socket 被关闭,block 在 receive 那里的线程会继续往下走的
    sky2017
        14
    sky2017  
       2018-01-03 09:22:09 +08:00
    @snnn 对的,只要 socket 关闭,receive 会立刻出错返回
    janxin
        15
    janxin  
       2018-01-03 09:55:36 +08:00
    close socket 一般会出错或者异常,catch 或者处理一下即可。
    v2byy
        16
    v2byy  
    OP
       2018-01-03 12:49:45 +08:00 via iPhone
    @sjx95 现在就是 catch 了一下异常
    cholerae
        17
    cholerae  
       2018-01-03 13:03:36 +08:00
    receive 的时候挂个超时。
    cholerae
        18
    cholerae  
       2018-01-03 13:04:38 +08:00
    服务端在两处 close socket 是高危行为。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1158 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:33 · PVG 02:33 · LAX 10:33 · JFK 13:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.