2011-10-18 41 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++">>,