2011-10-18 42 views
2

我已经写了非常简单的C++代码段:如何将Erlang连接到C++?

#include <iostream> 
using namespace std; 

int main() { 

int message; 

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

我在壳测试它 - 它返回这是在外壳的输入的值。

但是,当我尝试从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. 

如何将我的二郎口连接到这个简单的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; 
} 

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

+2

你的问题无关,与C++。您正在寻找的是如何连接衍生进程的标准I/O文件。 –

+0

您能详细解释一下吗?谢谢! – skanatek

+0

但用第二种形式,您正在等待终端的4个字节,例如。也许'\ n \ r'两次。我强烈建议在Erlang和C++两边同时抛弃二进制协议,并且只使用文本,除非你有明确的性能要求。 – Useless

回答

2

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

如果你想读的二进制数据,使用

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

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

+0

对不起,我忘了添加免责声明:我是C++初学者。我改变了'cin >>信息;'行到你提供的,但我仍然得到{exit_status,0} – skanatek

+0

和输出端?底线是,流的插入和提取操作符重载通常用于格式化文本,而不是二进制数据。我会把输出端放在我的答案中... – Useless

+0

谢谢!我用新的代码更新了这个问题。很抱歉成为这样的C++新手 - 我只能通过Java经验编写非常简单的C++程序。 – skanatek

1

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

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

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