如何将Erlang连接到C ++?

时间:2011-10-18 11:38:26

标签: c++ interop erlang erlang-ports

我编写了一段非常简单的C ++代码:

#include <iostream>
using namespace std;

int main() {

int message;

cin >> message;
cout << message;
return 0;
}

我在shell中测试了它 - 它返回一个在shell中输入的值。

但是当我尝试从Erlang调用它时,它返回{exit_status,0},据我所知,它只是exited

Erlang代码在这里:

p(Param) ->
    ?DBG("Starting~n", []),
    Cmd = "./Echo\n",
    Port = open_port({spawn,Cmd}, [binary,{packet, 4},  exit_status]),
    Payload = term_to_binary(list_to_binary(integer_to_list(Param))),
    ?DBG("Opened the port: ~w~n", [Port]),
    erlang:port_command(Port, Payload),
    ?DBG("Sent command to port: ~w~n", [Payload]),
    ?DBG("Ready to receive results for command: ~w~n", [Payload]),
    receive
        {Port, {data, Data}} ->
            ?DBG("Received data: ~w~n", [Data]),
            {result, Text} = binary_to_term(Data),
            Blah = binary_to_list(Text),
            io:format("~p~n", [Blah]);
        Other ->
            io:format("Unexpected data: ~p~n", [Other])

    end.

如何将我的Erlang端口连接到这个简单的C ++代码?

UPD:

将C ++代码更改为此(无用版本):

#include <iostream>
using namespace std;

int main() {

int message;

cin.read(reinterpret_cast<char *>(&message), 4);
cout.write(reinterpret_cast<char *>(&message), 4);
return 0;
}

Erlang端口进程仍然获得{exit_value,0}。如果我在shell中运行此代码,则直到我按两次Return键才会回显键盘输入。

3 个答案:

答案 0 :(得分:2)

你知道提取运算符cin >>需要格式化输入,对吗? 也就是说,它会提取一个表示整数的字符串,但可能不会处理4字节的二进制整数或Erlang发送的任何内容。

如果要读取二进制数据,请使用

cin.read(reinterpret_cast<char *>(&message), 4);
cout.write(reinterpret_cast<char *>(&message), 4);
例如,

。 或者,当然,在Erlang方面编写和接收文本。

答案 1 :(得分:1)

使用{packet,4} Erlang添加并期望以下二进制文件的附加信息。并且,term_to_binary / 1将整数编码为BERT格式(类似于thrift的二进制格式)。为了便于测试,您应该使用带有解析的文本协议:

不是:Payload = term_to_binary(list_to_binary(integer_to_list(Param))),

但是:Payload = <<"hello, C++">>,

答案 2 :(得分:0)

也许可接受的解决方法be IPCZeroC具有出色的C ++支持,看起来似乎也是decent Erlang support