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

2018 年 1 月 2 日
 v2byy
比如:
起一个线程建立 socket 连接之后,调 receive 来 block 当前线程,程序退出如何安全的关闭掉该 socket 连接呢?
4449 次点击
所在节点    程序员
18 条回复
zj299792458
2018 年 1 月 2 日
程序都退出了,关一个 socket 还能有多危险……
0Kelvin
2018 年 1 月 2 日
写个 log 再关?
v2byy
2018 年 1 月 2 日
@zj299792458 抛个异常出来总不好吧
wwqgtxx
2018 年 1 月 2 日
@v2byy 那就加个 try catch 呗
v2byy
2018 年 1 月 2 日
@0Kelvin 直接将线程 abort 掉?
v2byy
2018 年 1 月 2 日
@wwqgtxx 嗯,不知道有没有什么好方法……
lifespy
2018 年 1 月 2 日
.close
veelog
2018 年 1 月 2 日
发个信号给线程,通知退出
wwqgtxx
2018 年 1 月 2 日
试试在另一个线程去 close 这个 socket,这个取决于底层 API 实现,在有些实现中是可以这样干的
firstway
2018 年 1 月 3 日
应该可以从另外线程 close,block 的这个可能会读到 EOF 或这异常(可能语言相关)。
hjc4869
2018 年 1 月 3 日
双向 shutdown
sjx95
2018 年 1 月 3 日
不知道 lz 是什么语言哦,Java 的话 catch 一个 InterruptedException 就可以了,C 的话我不清楚,估计需要用 SIGINT 之类的?另外把 socket 存在一张表里面,直接 abort 线程然后从父线程关闭 socket 应该也可以。
C++的话,我记得以前我好像是用的 asio 异步+lambda 表达式模拟的同步,平时用 io_service.run()阻塞线程,需要关闭的时候就在另一个线程调用 io_service.cancle()。其实也挺丑的。
snnn
2018 年 1 月 3 日
任何线程都可以 shutdown 这个 socket。一旦这个 socket 被关闭,block 在 receive 那里的线程会继续往下走的
sky2017
2018 年 1 月 3 日
@snnn 对的,只要 socket 关闭,receive 会立刻出错返回
janxin
2018 年 1 月 3 日
close socket 一般会出错或者异常,catch 或者处理一下即可。
v2byy
2018 年 1 月 3 日
@sjx95 现在就是 catch 了一下异常
6ufq0VLZn0DDkL80
2018 年 1 月 3 日
receive 的时候挂个超时。
6ufq0VLZn0DDkL80
2018 年 1 月 3 日
服务端在两处 close socket 是高危行为。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/419447

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX