【问题标题】:Erlang get_tcp packets receiveErlang get_tcp 数据包接收
【发布时间】:2014-09-09 10:02:55
【问题描述】:

我正在编写运行以下协议的 erlang tcp-server。

  1. 每个数据包的大小正好为 4 个字节。
  2. 有一个特殊情况的数据包 - <<?SPECIAL_BYTE, 0, PayloadLength:2/big-unsigned-integer-unit:8>>。此数据包表明,该服务器必须读取下一个 PayloadLength 字节的原始数据。

当然,我可以接收原始数据流并用 erlang 代码解析这个协议。但我想知道,有没有办法使用内置的 erlang 数据包打包?当我的数据包前面有它的长度时,我可以说 [{packet, HeaderLength}]。有什么办法可以强制erlang将接收到的数据自动打包成4字节的chuks?

UPD:我打算使用 {active, once} 模式。我也可以使用 gen_tcp:recv(Socket, 4),但我担心在这种情况下会因为多个套接字读取而降低性能。我的恐惧有道理吗?

【问题讨论】:

    标签: tcp erlang


    【解决方案1】:

    Erlang 的原生数据包解码非常有用,它与您的数据的实际格式匹配时。如果您的数据包始终使用 4 字节(32 位)大端长度编码,那么 {packet, 4} 正是您所需要的。但是,如果您的编码中有一些异常,那么您必须使用{packet, raw} 并自己进行解码

    对于解码,您确实可以在被动模式下使用套接字 witb {active, false},读取四个字节,然后读取数据包的其余部分。您也可以在活动模式下使用套接字,但在这种情况下,您必须准备好接收少于或多于数据包头的数据,包括多个数据包。 {active, once} 可以帮助但不能解决问题。在您的情况下,被动模式可能更容易处理。

    性能方面,可以参考以下问题: How can the "packet" option of socket in Erlang accelerate the tcp transmission so much? 但是,我强烈建议在尝试优化它之前专注于获得一个有效的实现。过早的优化永远不会产生好的结果。

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2012-09-01
      • 2013-08-14
      • 1970-01-01
      • 2014-06-26
      • 2021-04-10
      • 2010-10-31
      • 2010-12-09
      • 1970-01-01
      相关资源
      最近更新 更多