是gen_tcp:send / 2阻塞吗?

时间:2014-04-17 20:16:35

标签: tcp erlang

gen_tcp:send()是否异步?假设我将使用gen_tcp:send / 2发送一些字节数组。流程是否继续有效:

a)立即
b)当数据到达目标的内部缓冲区时 c)当目标从缓冲区获取数据时

提前谢谢你。

1 个答案:

答案 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},套接字将自动关闭。