在erlang和c ++之间发送数据

时间:2016-04-19 21:12:50

标签: c++ erlang

我正在使用tcp连接将数据发送到c ++服务器。我已经阅读了有关ei库的内容,当给定二进制文件时,它有一堆函数可以从二进制文件中获取解码后的值。 Egs,ei_decode_string,ei_decode_long等。

我正在尝试做这些简单的事情:
1.创建一个套接字并连接到它。

$rest

2。使用gen_tcp:send / 2发送数据。

{ok, Socket} = gen_tcp:connect({127,0,0,1}, 8986, []).

因此,我正在向服务器发送字符串的二进制格式。

我的服务器,C ++代码,获取数据,我试图获取客户端使用ei_decode_string通过套接字发送给我的任何内容,如:

理想情况下,解码后我应该回到字符串“Stackoverflow”,因为我告诉它来自二进制文件的decode_as_string。确保在生成的缓冲区中有足够的空间。

gen_tcp:send(Socket, term_to_binary("Stackoverflow")).

我无法解码我发送的字符串。我错过了什么吗?如果这不是正确的方法,我如何在服务器端发送数据并对其进行解码。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

1> term_to_binary("Stackoverflow").
<<131,107,0,13,83,116,97,99,107,111,118,101,114,102,108,
  111,119>>

这里二进制文件中的第一项不是小整数字符串,而是External Term Format中描述的版本号(131)。之后,每个术语都以标签为前缀,然后是相应的数据。在这种情况下,标签107 STRING_EXT,两个字节的长度(13),然后是13个8位整数,第一个83对应于字母'S'(在ascii中为83)。

要正确处理此二进制文件,请ei_decode_version之前调用ei_decode_string

  

int ei_decode_version(const char * buf,int * index,int * version)

     

此函数解码erlang二进制文件的版本幻数   术语格式。它必须是二元术语中的第一个标记。