【问题标题】:Chrome Experimental Socket API: What Does `chrome.experimental.socket.sendTo()` And `recvFrom()` Do?Chrome 实验性 Socket API:`chrome.experimental.socket.sendTo()` 和 `recvFrom()` 有什么作用?
【发布时间】:2012-07-19 22:41:28
【问题描述】:

这周,我稍微弄乱了 Chromium 的 Socket API。但是对于这个记录不良的实验界面,我还不是很清楚。

Google 代码上的 docs 是什么意思:

...关于sendTo()此刻:

在给定的套接字上写入数据。

  1. socketId ( integer )socketId。

  2. data ( ArrayBuffer ) 数据 写。

  3. address ( string ) 远程机器的地址。

  4. port ( integer ) 远程机器的端口。

  5. SendToCallback ( function )

sendTo() 的描述与write() 的描述完全相同(write - 在给定的套接字上写入数据。)。 recvFrom()read() 也一样——它们都有完全相同的描述(read - 从给定的套接字读取数据。 / recvFrom - 读取数据从给定的套接字。)。但是没有人对差异说任何有趣的事情。

我发现了什么:

不管我在做什么,sendTo 总是返回以下对象:

  • [-] 对象
    • bytesWritten: -2
    • [+] __proto__: 对象

如果我在所有这些情况下都使用write 而不是sendTo,那么一切都会按预期进行。

recvFrom()read() 也是如此 - read() 正常工作,recvFrom() 失败。

我的问题:

  • sendTo() 是什么,write() 有什么区别 和sendTo()?
  • recvFrom() 是什么,read()recvFrom() 有什么区别?
  • 为什么有这么多类似的方法?
  • 并且:是否有一些关于 Socket API 的更多信息? Google Code 文档非常轻量级。 chromium.org上没有相关的文章吗?

谢谢。

【问题讨论】:

  • 我最好的猜测是sendTo 用于未参与connect 操作的套接字。如果您不使用connect 套接字,sendTo 是否有效?
  • @apsillers 我对此进行了一些试验,sendTo 工作的唯一情况是当我在绑定的 UDP 套接字上应用该方法时。我在 Google Code 或 chrome.org 上找不到任何相关信息,但我认为目前在 TCP 套接字上没有任何使用 sendTo 的案例。

标签: sockets google-chrome tcp google-chrome-extension chromium


【解决方案1】:

对造成的混乱表示歉意。我们正在根据您的问题推出improvement to the documentation

Chrome 套接字 API 是 POSIX 套接字 API 子集之上的一个薄层。它遵循 read()/write() 用于连接的套接字的约定,而 sendto()/recvfrom() 用于未连接的套接字。冒着过度简化的风险,您可能希望将前者用于面向连接的协议 (TCP),而将后者用于无连接协议 (UDP)。在Wikipedia article on UDP 中有一个很好的比较为什么人们会选择 TCP 和 UDP。

【讨论】:

  • 谢谢。只有一个与此相关的问题:为什么 TCP 方法名称与 UDP 方法名称不同?有什么特殊原因还是你只是取了 POSIX 的名字?
【解决方案2】:

我对套接字知之甚少,但我认为文档混淆了,当从浏览器启动连接时使用 sendTo (或者可能反过来,另一个应该在客户端时使用启动到浏览器的套接字连接,但我在任何地方都看不到任何 SocketServer 支持,所以......无论如何)。来自source(查看参数):

  • write()

      // Writes data on the given socket.
      // |socketId| : The socketId.
      // |data| : The data to write.
      // |callback| : Called when the first of any of the following happens: the
      // write operation completes without blocking, the write operation blocked
      // before completion (in which case onEvent() will eventually be called with
      // a <code>writeComplete</code> event), or an error occurred.
      static void write(long socketId,
                        ArrayBuffer data,
                        WriteCallback callback);
    
  • sendTo()

      // Writes data on the given socket.
      // |socketId| : The socketId.
      // |data| : The data to write.
      // |address| : The address of the remote machine.
      // |port| : The port of the remote machine.
      // |callback| : Called when the first of any of the following happens: the
      // write operation completes without blocking, the write operation blocked
      // before completion (in which case onEvent() will eventually be called with
      // a <code>writeComplete</code> event), or an error occurred.
      static void sendTo(long socketId,
                         ArrayBuffer data,
                         DOMString address,
                         long port,
                         SendToCallback callback);
    

您可以在我给您的链接 (experimental_socket.idl) 中找到其余文档。

【讨论】:

  • 感谢您的回答。到目前为止,我尝试的所有内容都支持您的假设。所以我认为recvFrom()/sendTo() 目前对于 TCP 套接字是不可操作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多