V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sen506
V2EX  ›  问与答

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

  •  
  •   sen506 · 2017-05-07 21:54:59 +08:00 · 1777 次点击
    这是一个创建于 2757 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    2 条回复    2017-05-08 03:18:09 +08:00
    1423
        1
    1423  
       2017-05-07 23:18:16 +08:00 via iPhone
    先 shutdown 后 close
    hjc4869
        2
    hjc4869  
       2017-05-08 03:18:09 +08:00 via Android
    建议深入理解 TCP 状态图。
    代理转发数据,FIN 也是要正确转发的,始终需要注意一点就是 TCP 是可以单向关闭的,一个方向关闭后另一个方向仍然可以收发数据。
    socket A 先读到 0 字节( FIN )之后,对 socket B 调用 shutdown (主动关闭)。等 socket B 收到 FIN,再 shutdown socket A,最后两个 socket 一起 close。shutdown-close 之后的状态就是系统管了,主要是处理 TIME_WAIT 之类的状态。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:36 · PVG 05:36 · LAX 13:36 · JFK 16:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.