【问题标题】:sending data between erlang and c++在 erlang 和 c++ 之间发送数据
【发布时间】:2016-08-12 07:00:35
【问题描述】:

我正在使用 tcp 连接将数据发送到 c++ 服务器。我读过 ei 库,当给定一个二进制文件时,它有一堆函数可以从二进制文件中获取解码值。例如,ei_decode_string、ei_decode_long 等。

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

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

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

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

因此,我将二进制格式的字符串发送到服务器。

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

理想情况下,解码时我应该取回字符串“Stackoverflow”,因为我告诉它从二进制文件中 decode_as_string。确保结果缓冲区中有足够的空间。

char *p = (char*)malloc(sizeof(char) * 100);
int index = 0;
int decoded = ei_decode_string(buff, &index, p);
cout<<"The decoded value is "<<p<<endl;

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

感谢您的帮助!

【问题讨论】:

  • 想通了,但这只是一周的时间。我可以看到在服务器端,我收到了一个额外的问号(?),如果我通过缓冲区跳过该字符,ei_decode_string 工作正常。但不确定,为什么我会得到那个额外的问号(?)。
  • 我想和binary_to_list(term_to_binary("Stackoverflow"))一样的原因不能按预期工作
  • 为了得到正确、明确的答案:如果想将字符串转换为表示该字符串字符的二进制,则应使用list_to_binary/1。当收件人需要Erlang external term format 中的数据时,应使用term_to_binary
  • 确保使用 gen_tcp:connect(SomeHost, 8986, [binary, {packet, 0}])。 packet 选项指定多少字节表示数据包长度,这可能会添加您收到的额外字符。

标签: c++ erlang


【解决方案1】:
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 二进制文件的版本幻数 术语格式。它必须是二进制项中的第一个标记。

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 2014-02-20
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2015-11-27
    • 2011-05-11
    相关资源
    最近更新 更多