Home > Erlang探索 > Erlang和port通讯的数据格式

Erlang和port通讯的数据格式

October 22nd, 2009

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Erlang和port通讯的数据格式

erlang内置的port非常强大,是erlang通往外面世界的通道,所以port和erlang程序的通讯的数据格式影响了通讯的效率,和稳定性。我们在选择格式的时候, 会优先考虑到erlang的特性和port程序编写语言的特点,选出一种2者都容易处理的格式。

通讯通常有2种,基于行的文本和2进制格式。

行通讯最容易,因为是文本,调试起来就很方便。 形如这样的格式:
request args\n erlang编码这种格式就是加个\n, 解码可以用driver的{line, xxx}选项。而外部程序比如说c 解码可以用fgets, 编码也是加个\n. 缺点是: 表达上比较受限 不好表示结构数据。

2进制格式,形如这样的格式:
4个字节包长度 包体 . erlang和解码都可以利用driver的{packet,4} 自动把包体接处理。而外部程序比如说c 处理这样的也非常轻松。

包体有以下几种留下的格式:
1. 自定义格式。 比如: 4个字节cmd + 2个字节字符长度 + 字符
只要erlang和外部程序都能同样这种格式就好。erlang有很强大的binary处理这种事情很轻松, c同样也是。 缺点是太繁琐,格式变化的时候 容易漏掉东西。

2. erlang的外部协议格式。 erlang编码可以用term_to_binary, 解码用binray_to_term. c程序用ei库俩编解码。 这样erlang端的工作量就很小, c端的麻烦些。

3. json这样的格式。 erlang和c都用现成的json库来编码解码。

4. asn.1格式。erlang有强大的内置的asn编码解码。c端也有asn1c这样的编解码器。 写个asn1规格 2边各自生成代码,这样最轻松 而且能表达数据很轻松,推荐使用。

Post Footer automatically generated by wp-posturl plugin for wordpress.

  1. litaocheng
    October 26th, 2009 at 11:07 | #1

    呵呵,很好,asn.1要试一把 ..

  2. November 13th, 2009 at 20:26 | #2

    回来就发现:InfoQ: BERT as Dynamic Alternative to Protocol Buffers/Thrift
    http://www.infoq.com/news/2009/11/github-bert
    更加适合 erl 使用的数据格式,
    有进一步的各种格式规范的实战效率对比:
    Benchmarking – thrift-protobuf-compare – Project Hosting on Google Code
    http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

    yu feng Reply:

    Bert是个不错的东西 但是有局限性 因为erlang的通讯格式在变动 R12->R13就变得非常厉害,会影响到bert的稳定性。

Comments are closed.