boost async_write 是否保证数据发完后才关闭?

2017-05-07 21:54:59 +08:00
 sen506

最近试了下用 boost 写代理。
主要流程如下:
A, B 2 个 socket(A 负责浏览器数据, B 负责远端数据, 同一个 io_service), 相互转发数据(async_read_some 后调用 async_write), A, B 任意一个关闭都会导致 2 个 socket 一起关闭(调用 socket->close())。

但测试过程中发现有时候浏览器从 A 获取数据的时候会出现异常(数据未收完就关闭了), 所以想问下, 这里的async_write 是不是无法保证在被主动关闭的时候将缓冲区的数据发完后才关闭?

1745 次点击
所在节点    问与答
2 条回复
1423
2017-05-07 23:18:16 +08:00
先 shutdown 后 close
hjc4869
2017-05-08 03:18:09 +08:00
建议深入理解 TCP 状态图。
代理转发数据,FIN 也是要正确转发的,始终需要注意一点就是 TCP 是可以单向关闭的,一个方向关闭后另一个方向仍然可以收发数据。
socket A 先读到 0 字节( FIN )之后,对 socket B 调用 shutdown (主动关闭)。等 socket B 收到 FIN,再 shutdown socket A,最后两个 socket 一起 close。shutdown-close 之后的状态就是系统管了,主要是处理 TIME_WAIT 之类的状态。

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

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

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

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

© 2021 V2EX