boost::asio 写的 tcp-server 能否发 RST 包

2018-08-01 21:36:12 +08:00
 fyyz
我是这么写的:

socket_.shutdown(tcp::socket::shutdown_both);
socket_.close();

但是我抓包看了下发的还是正常的四次挥手的 FIN 包而不是 RST 包。

asio 能否直接发 RST 包来关闭连接?
3075 次点击
所在节点    C
12 条回复
mattx
2018-08-01 21:41:05 +08:00
rst 好像是在异常的情况才会触发吧?如果要手动,需要自己伪造
reus
2018-08-01 22:44:10 +08:00
为什么你要发 RST 包?
farseeraliens
2018-08-01 22:45:49 +08:00
shutdown 本端然后对端有写才会 rst
dbow
2018-08-01 22:53:25 +08:00
用 SO_LINGER 选项
jedihy
2018-08-02 01:32:41 +08:00
raw_socket. 不要用正常 tcp 搞这种奇技淫巧。
fyyz
2018-08-02 07:29:14 +08:00
@reus 客户端发来的数据格式不对,或者超时,我想直接用 rst 关掉,不想因此四次挥手,免得卡 time_wait 之类的
fyyz
2018-08-02 07:32:47 +08:00
@jedihy nginx 有个私有返回码 444,其作用就是发 rst,我一直用这个返回码来处理空主机名的请求
des
2018-08-02 07:43:41 +08:00
@fyyz 你确定?
建议你自己去看看源码
fyyz
2018-08-02 07:51:39 +08:00
@des 我没用 wireshark 抓包看,但是我记得用 curl 发请求过去会输出 connect reset 之类的。现在在上班路上,回家抓个包确认一下
fyyz
2018-08-02 07:53:50 +08:00
@dbow 谢谢大佬,看了下感觉就是我要的,在应用层设置而不用去改 tcp 协议栈的配置文件
jedihy
2018-08-02 08:01:21 +08:00
@fyyz 你直接 close 不 shutdown,收到对端的 packet,有的操作系统的实现是发 RST 的。
dndx
2018-08-02 08:03:20 +08:00
@dbow 正解。

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

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

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

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

© 2021 V2EX