gen_tcp:send()是否异步?假设我将使用gen_tcp:send / 2发送一些字节数组。流程是否继续有效:
a)立即
b)当数据到达目标的内部缓冲区时
c)当目标从缓冲区获取数据时
提前谢谢你。
答案 0 :(得分:3)
gen_tcp:send/2
是同步的。这意味着只有在真正发送给定数据包后才会返回调用。通常它会立即发生,但是如果TCP窗口已满,则gen_tcp:send/2
阻塞,直到发送数据为止。因此,这意味着调用理论上可以无限地阻塞(例如,当接收器不从套接字读取数据时)。
幸运的是,有一些选择可以避免这种情况。对于套接字,有两个选项{send_timeout, Integer}
和{send_timeout_close, Boolean}
,可以通过调用inet:setopts/2
指定。第一个允许指定等待发送操作的最长时间。
超过限制时,发送操作将返回{error, timeout}
。该选项的默认值为infinity
(这是无限块的原因)。还不幸的是,如果返回{error, timeout}
,则无法发送多少数据。在这种情况下,最好关闭套接字。如果第二个选项{send_timeout_close, Boolean}
设置为true
,那么如果发生{error, timeout}
,套接字将自动关闭。