WebSocket.send()是否复制传递的数组缓冲区,以便以后可以安全地修改它?说:
var a = new Uint8Array([1, 2, 3]);
websocket.send(a);
a[2] = 4;
即使套接字已满且缓冲区未立即发送,这是否安全?
答案 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 连接仍然建立(数据已排队或发送 成功),如果连接关闭,则为假(例如,因为 用户代理只是有一个缓冲区溢出而无法发送数据)。
注意,如果套接字缓冲区已满,则触发错误条件并关闭套接字。
此外,从实现的角度来看,这是有道理的。确切地说,当字节实际通过网络发送时,是套接字实现的细节,因此,他们必须将字节复制到自己的缓冲区中,以便在数据发送之前保持对数据的控制(设计的安全编程实践)像这样)。否则,调用代码恢复缓冲区可能会出现可怕的时序问题。