【发布时间】:2015-01-24 13:06:40
【问题描述】:
WebSocket.send() 是否复制传递的数组缓冲区,以便之后可以安全地对其进行修改?说:
var a = new Uint8Array([1, 2, 3]);
websocket.send(a);
a[2] = 4;
即使套接字已满并且没有立即发送缓冲区,这是否安全?
【问题讨论】:
标签: javascript websocket typedarray
WebSocket.send() 是否复制传递的数组缓冲区,以便之后可以安全地对其进行修改?说:
var a = new Uint8Array([1, 2, 3]);
websocket.send(a);
a[2] = 4;
即使套接字已满并且没有立即发送缓冲区,这是否安全?
【问题讨论】:
标签: javascript websocket typedarray
是的,在WebSocket.send() 之后修改缓冲区是安全的。
working draft of the WebSocket specification 指的是套接字的单独缓冲区,因此数据要么立即发送,要么复制到单独的缓冲区中。
send(data) 方法使用连接传输数据。如果 readyState 属性为 CONNECTING,它必须引发 INVALID_STATE_ERR 例外。如果 data 参数有任何不成对的代理项,那么它 必须提高 SYNTAX_ERR。如果连接建立,并且 字符串没有未配对的代理,那么用户代理必须发送数据 使用 Web 套接字。如果无法发送数据,例如因为它 需要缓冲但缓冲区已满,用户代理必须 关闭 Web Socket 连接。然后,该方法必须返回 true 如果 连接仍然建立(并且数据已排队或发送 成功),如果连接关闭则返回 false(例如,因为 用户代理刚刚发生缓冲区溢出,无法发送数据)。
请注意,如果套接字缓冲区已满,则会触发错误条件并关闭套接字。
此外,从实现的角度来看,这是有道理的。字节实际何时通过网络发送是套接字实现的细节,因此,它们必须将字节复制到自己的缓冲区中,以便在发送数据之前保持对数据的控制(设计的安全编程实践像这样)。否则,调用代码重新调用缓冲区可能会出现可怕的时间问题。
【讨论】: