gpt4 book ai didi

sockets - 套接字如何通过erlang中的数据包发送数据?

转载 作者:行者123 更新时间:2023-12-03 11:53:12 26 4
gpt4 key购买 nike

因此,我正在阅读以尝试查找有关套接字的更多信息,并且我发现文档本身会重复,而没有关于套接字发送数据的方式的任何进一步详细信息:

那么 {packet, N} 是什么意思?在选项中指定这个时(打开套接字时)怎么办?它是在数据之前包含 N 个字节的 header 还是将消息分成 N 个数据包?或者它是否在消息最终被分解的所有数据包中都包含 N 的 header ?

我正在阅读 Joe Armstrong 的 Software for a concurrent world,我发现了这一段:

The word packet refers to the length of an application request or response message, not to the physical packet seen on the wire.



我无法理解这句话的含义。 packet seen on the wire 是什么意思.

我试图查看文档,但发现很少提及该选项的作用。我发现的简短解释是它在消息前加上 N header ,但是我还在作为示例编写的代码中找到了此注释:
           %% Usually, it's a good idea to give up in case of a 
%% send timeout, as you never know how much actually
%% reached the server, maybe only a packet header?!

根据这个,然后,消息被分成几部分(我猜是一个随机数?),每一个都用一个 N 字节的头发送。

我的问题是 {header, N}选项影响数据的发送方式。

最佳答案

您引用的 Joe 书中的摘录提到了这样一个事实,即应用程序通常很高兴地不知道网络如何安排数据进行传输。根据使用的网络类型、配置和协议(protocol),通过它发送的数据 block 的大小会有所不同,并且将使用不同的元数据进行框架化。应用程序通常看不到原始数据包、成帧信息,或者有时原始数据包由于导致它们被丢弃或损坏的问题而被重新传输的事实。
您的问题提到了两个选项:{packet, N}{header, N} .这些是完全不同的。

  • {packet, N}选项允许 N为 1、2 或 4。它附加了 N 的标题字节到消息的前面。 header 按网络顺序指定消息的长度,即消息中的字节数。
    如果您发送的消息包含 X字节,Erlang 将添加到数据 N包含 X 的网络顺序值的字节,并发送整个内容。假设接收器也配置了相同的{packet, N}选项,它将读取 N -byte header 来确定预期的字节数,等待接收那么多字节,然后将这些字节(不带长度 header )传递给接收应用程序。底层网络软件和硬件如何将数据分解成 block 以便在网络上传输是隐藏在您的应用程序中的独立问题。
  • {header, Size}选项将消息作为 Size 的列表传递给接收者字节后跟数据的其余部分作为二进制。此选项仅在 binary 时才有意义。选项对套接字有效。
  • 关于sockets - 套接字如何通过erlang中的数据包发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29481321/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com