我编写了一段非常简单的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键才会回显键盘输入。
答案 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 IPC? ZeroC具有出色的C ++支持,看起来似乎也是decent Erlang support。