我正在使用 Erlang 通过 TCP 接收消息gen_tcp
。如选项所指定,使用 4 字节长度的标头将流划分为数据包{packet, 4}
。这就是我所说的gen_tcp:listen/2
:
gen_tcp:listen(Port, [binary, inet, {active, once}, {packet, 4}]).
正如你所看到的,我使用了这个{active, once}
选项,这样我就可以从进程邮箱中获取我的数据包而不会淹没它。只要长度标头正确,它就可以正常工作。如果不是,任何事情都可能发生。所以我想以某种方式处理错误数据包的可能性。
这有点棘手,因为我实际上正在处理流。忽略错误的数据包是可以的,但是我如何让 Erlang 跳过这些数据包并识别后面的数据包?这个问题一般是怎么处理的?
使用分隔符更好吗?我已经查看packet
了gen_tcp
. 特别是以下内容:
asn1 | cdr | sunrm | fcgi | tpkt | line
我唯一真正理解的含义是line
,但我认为这不是一个好的选择。我期待收到在我不熟悉的 Objective C 中发送和构建的包,其中包含许多不同类型的数据,而不仅仅是字符串。