所以我正在阅读试图找到更多关于套接字的内容,我发现文档类型重复了一遍,而没有详细介绍套接字发送数据的方式:
那么{packet, N}
在选项中指定它时(打开套接字时)会做什么?它是否在数据之前包含N个字节的标头,还是将消息分成N个数据包?或者它是否包含一个N的标题到消息最终被分成的所有数据包?
我正在阅读Joe Armstrong的软件并发世界,我找到了这一段:
字包指的是应用请求或响应消息的长度,而不是电线上看到的物理包。
我无法理解这个含义。 packet seen on the wire
是什么意思。
我试着查看文档,但我发现很少涉及该选项的作用。我发现的简短解释是它在消息前面添加了一个N头但是我也在代码中找到了这个注释作为例子:
%% 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}
选项如何影响数据的发送方式。
答案 0 :(得分:2)
你引用Joe的书的摘录指的是这样一个事实,即应用程序通常不知道网络如何安排数据进行传输。根据所使用的网络类型,配置和协议,通过它发送的数据块的大小会有所不同,并且将使用不同的元数据进行框架化。应用程序通常看不到原始数据包,帧信息,或者有时原始数据包由于导致它们被丢弃或损坏的问题而被重新传输的事实。
您的问题提到了两个选项:{packet, N}
和{header, N}
。这些是完全不同的。
{packet, N}
选项允许N
为1,2或4.它会在消息的前面附加N
个字节的标头。标头按网络顺序指定消息的长度,即消息中的字节数。
如果发送包含X
字节的消息,Erlang将在数据N
前加上包含网络订单值X
的字节,并发送整个内容。假设接收器也配置了相同的{packet, N}
选项,它将读取N
- 字节头以确定预期的字节数,等待接收那么多字节,然后传递这些字节,没有长度标题,到接收应用程序。底层网络软件和硬件如何将数据分成块以便通过网络传输,这是一个与您的应用程序隐藏的单独问题。
{header, Size}
选项将消息作为Size
字节的列表传递给接收方,后跟剩余的数据作为二进制。仅当binary
选项对套接字有效时,此选项才有意义。