在WebSocket.send()之后修改缓冲区是否安全?

时间:2014-11-26 09:13:43

标签: javascript websocket typedarray

WebSocket.send()是否复制传递的数组缓冲区,以便以后可以安全地修改它?说:

var a = new Uint8Array([1, 2, 3]);
websocket.send(a);
a[2] = 4;

即使套接字已满且缓冲区未立即发送,这是否安全?

1 个答案:

答案 0 :(得分:2)

是的,在WebSocket.send()之后修改缓冲区是安全的。

working draft of the WebSocket specification指的是套接字的单独缓冲区,因此数据可以立即发送或复制到单独的缓冲区中。

  

send(data)方法使用连接传输数据。如果   readyState属性是CONNECTING,它必须引发INVALID_STATE_ERR   例外。如果data参数有任何未配对的代理,那么它   必须提高SYNTAX_ERR。如果建立了连接,那么   string没有未配对的代理,那么用户代理必须发送数据   使用Web Socket。如果无法发送数据,例如因为它   需要缓冲,但缓冲区已满,用户代理必须   关闭Web Socket连接。如果,该方法必须返回true   连接仍然建立(数据已排队或发送   成功),如果连接关闭,则为假(例如,因为   用户代理只是有一个缓冲区溢出而无法发送数据)。

注意,如果套接字缓冲区已满,则触发错误条件并关闭套接字。

此外,从实现的角度来看,这是有道理的。确切地说,当字节实际通过网络发送时,是套接字实现的细节,因此,他们必须将字节复制到自己的缓冲区中,以便在数据发送之前保持对数据的控制(设计的安全编程实践)像这样)。否则,调用代码恢复缓冲区可能会出现可怕的时序问题。