比如:
起一个线程建立 socket 连接之后,调 receive 来 block 当前线程,程序退出如何安全的关闭掉该 socket 连接呢?
起一个线程建立 socket 连接之后,调 receive 来 block 当前线程,程序退出如何安全的关闭掉该 socket 连接呢?
|
zj299792458Jan 2, 2018 via iPhone
1
程序都退出了,关一个 socket 还能有多危险……
|
|
0KelvinJan 2, 2018
2
写个 log 再关?
|
|
3
@zj299792458 抛个异常出来总不好吧
|
|
lifespyJan 2, 2018
7
.close
|
|
veelogJan 2, 2018 via iPhone
8
发个信号给线程,通知退出
|
|
wwqgtxxJan 2, 2018
9
试试在另一个线程去 close 这个 socket,这个取决于底层 API 实现,在有些实现中是可以这样干的
|
|
firstwayJan 3, 2018
10
应该可以从另外线程 close,block 的这个可能会读到 EOF 或这异常(可能语言相关)。
|
|
hjc4869Jan 3, 2018 via iPhone
11
双向 shutdown
|
|
sjx95Jan 3, 2018
12
不知道 lz 是什么语言哦,Java 的话 catch 一个 InterruptedException 就可以了,C 的话我不清楚,估计需要用 SIGINT 之类的?另外把 socket 存在一张表里面,直接 abort 线程然后从父线程关闭 socket 应该也可以。
C++的话,我记得以前我好像是用的 asio 异步+lambda 表达式模拟的同步,平时用 io_service.run()阻塞线程,需要关闭的时候就在另一个线程调用 io_service.cancle()。其实也挺丑的。 |
|
snnnJan 3, 2018 via Android
13
任何线程都可以 shutdown 这个 socket。一旦这个 socket 被关闭,block 在 receive 那里的线程会继续往下走的
|
|
janxinJan 3, 2018
15
close socket 一般会出错或者异常,catch 或者处理一下即可。
|
|
6ufq0VLZn0DDkL80Jan 3, 2018
17
receive 的时候挂个超时。
|
|
6ufq0VLZn0DDkL80Jan 3, 2018
18
服务端在两处 close socket 是高危行为。
|