V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
sen506
V2EX  ›  问与答

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

  •  
  •   sen506 · May 7, 2017 · 2042 views
    This topic created in 3284 days ago, the information mentioned may be changed or developed.

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

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

    2 replies    2017-05-08 03:18:09 +08:00
    slowman
        1
    slowman  
       May 7, 2017 via iPhone
    先 shutdown 后 close
    hjc4869
        2
    hjc4869  
       May 8, 2017 via Android
    建议深入理解 TCP 状态图。
    代理转发数据,FIN 也是要正确转发的,始终需要注意一点就是 TCP 是可以单向关闭的,一个方向关闭后另一个方向仍然可以收发数据。
    socket A 先读到 0 字节( FIN )之后,对 socket B 调用 shutdown (主动关闭)。等 socket B 收到 FIN,再 shutdown socket A,最后两个 socket 一起 close。shutdown-close 之后的状态就是系统管了,主要是处理 TIME_WAIT 之类的状态。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2631 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:09 · PVG 19:09 · LAX 04:09 · JFK 07:09
    ♥ Do have faith in what you're doing.