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

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


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

最佳答案

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

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


  send(data)方法使用连接传输数据。如果
  readyState属性为CONNECTING,必须引发INVALID_STATE_ERR
  例外。如果data参数具有任何不成对的替代,则它
  必须提高SYNTAX_ERR。如果建立连接,并且
  字符串没有成对的替代,则用户代理必须发送数据
  使用Web套接字。如果无法发送数据,例如因为它
  需要缓冲但缓冲区已满,用户代理必须
  关闭Web套接字连接。然后,如果该方法必须返回true
  连接仍然建立(并且数据已排队或已发送
  成功);如果连接已关闭,则返回false(例如,因为
  用户代理只是缓冲区溢出而无法发送数据)。


请注意,如果套接字缓冲区已满,则会触发错误情况,并且套接字已关闭。

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

关于javascript - 在WebSocket.send()之后修改缓冲区是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27145175/

10-16 16:00