2

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

#include <iostream>
using namespace std;

int main() {

int message;

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

我已经在 shell 中对其进行了测试——它返回一个在 shell 中输入的值。

但是当我尝试从 Erlang 调用它时,它返回 {exit_status,0},据我了解,这意味着它刚刚退出

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++ 代码?

升级版:

将 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 之前不会回显键盘输入。

4

3 回答 3

2

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

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

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

例如。或者,当然,在 Erlang 端编写和接收文本。

于 2011-10-18T13:03:51.923 回答
1

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

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

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

于 2011-10-19T01:57:06.133 回答
0

也许可以接受的解决方法是 IPCZeroC具有出色的 C++ 支持,而且看起来也不错的 Erlang 支持

于 2011-10-18T11:42:16.410 回答