论坛首页 综合技术论坛

erlang和port通讯的数据格式

浏览 2287 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-10-22   最后修改:2009-10-22
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边各自生成代码,这样最轻松 而且能表达数据很轻松,推荐使用。












   发表时间:2009-10-23  
突然想起,port通信能不能用Thrift/Protocol buffer这些协议?socket通信是可以的
0 请登录后投票
   发表时间:2009-10-23  
可以呀 json/asn.1/thrift/protol buffer是一个等级的东西。
0 请登录后投票
   发表时间:2010-01-26  
由于不是很懂C,俺瞎揣的,一般的port就是pipe描述符,socket就是socket文件描述符,总之port就是和文件对应的一切都是文件。
0 请登录后投票
   发表时间:2010-01-27  
rain2005 写道
由于不是很懂C,俺瞎揣的,一般的port就是pipe描述符,socket就是socket文件描述符,总之port就是和文件对应的一切都是文件。


port就是文件句柄+buffer+一堆erts内部数据结构.
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics