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

2018-01-02 17:55:05 +08:00
 v2byy
比如:
起一个线程建立 socket 连接之后,调 receive 来 block 当前线程,程序退出如何安全的关闭掉该 socket 连接呢?
3997 次点击
所在节点    程序员
18 条回复
zj299792458
2018-01-02 18:09:31 +08:00
程序都退出了,关一个 socket 还能有多危险……
0Kelvin
2018-01-02 19:30:45 +08:00
写个 log 再关?
v2byy
2018-01-02 20:04:45 +08:00
@zj299792458 抛个异常出来总不好吧
wwqgtxx
2018-01-02 20:13:30 +08:00
@v2byy 那就加个 try catch 呗
v2byy
2018-01-02 20:15:11 +08:00
@0Kelvin 直接将线程 abort 掉?
v2byy
2018-01-02 20:16:09 +08:00
@wwqgtxx 嗯,不知道有没有什么好方法……
lifespy
2018-01-02 20:56:21 +08:00
.close
veelog
2018-01-02 21:00:07 +08:00
发个信号给线程,通知退出
wwqgtxx
2018-01-02 23:39:24 +08:00
试试在另一个线程去 close 这个 socket,这个取决于底层 API 实现,在有些实现中是可以这样干的
firstway
2018-01-03 02:26:01 +08:00
应该可以从另外线程 close,block 的这个可能会读到 EOF 或这异常(可能语言相关)。
hjc4869
2018-01-03 03:07:24 +08:00
双向 shutdown
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
2018-01-03 07:43:35 +08:00
任何线程都可以 shutdown 这个 socket。一旦这个 socket 被关闭,block 在 receive 那里的线程会继续往下走的
sky2017
2018-01-03 09:22:09 +08:00
@snnn 对的,只要 socket 关闭,receive 会立刻出错返回
janxin
2018-01-03 09:55:36 +08:00
close socket 一般会出错或者异常,catch 或者处理一下即可。
v2byy
2018-01-03 12:49:45 +08:00
@sjx95 现在就是 catch 了一下异常
cholerae
2018-01-03 13:03:36 +08:00
receive 的时候挂个超时。
cholerae
2018-01-03 13:04:38 +08:00
服务端在两处 close socket 是高危行为。

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

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

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

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

© 2021 V2EX