【发布时间】:2014-06-02 06:50:57
【问题描述】:
gen_tcp:send() 是异步的吗?假设我将使用 gen_tcp:send/2 发送一些字节数组。进程是否会继续工作:
a) 立即
b)此时数据将到达目标的内部缓冲区
c) 当目标从缓冲区获取数据时
提前谢谢你。
【问题讨论】:
gen_tcp:send() 是异步的吗?假设我将使用 gen_tcp:send/2 发送一些字节数组。进程是否会继续工作:
a) 立即
b)此时数据将到达目标的内部缓冲区
c) 当目标从缓冲区获取数据时
提前谢谢你。
【问题讨论】:
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} 发生时,套接字将自动关闭。
【讨论】: