• 请不要在回答技术问题时复制粘贴 AI 生成的内容
v2byy
V2EX  ›  程序员

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

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