Как мне подключить Erlang к C ++? - PullRequest
2 голосов
/ 18 октября 2011

Я написал очень простой фрагмент кода на C ++:

#include <iostream>
using namespace std;

int main() {

int message;

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

Я проверил его в оболочке - он возвращает значение, введенное в оболочку.

Но когдаЯ пытаюсь вызвать его из Erlang, он возвращает {exit_status, 0}, что, как я понимаю, означает, что он просто вышел .

Код Эрланга находится здесь:

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}.Если я запускаю этот код в оболочке, ввод с клавиатуры не отображается, пока я дважды не нажму Return.

Ответы [ 3 ]

2 голосов
/ 18 октября 2011

Вы знаете, что оператор извлечения cin >> ожидает форматированный ввод, верно?Иными словами, он извлечет строку, представляющую целое число, но, вероятно, не очень хорошо справится с 4-байтовым двоичным целым числом или чем-то, что посылает Эрланг.

Если вы хотите читать двоичные данные, используйте

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

например.Или, конечно, написать и получить текст на стороне Erlang.

1 голос
/ 19 октября 2011

С помощью {package, 4} Erlang добавляет и ожидает дополнительную информацию для следующих двоичных файлов.И term_to_binary / 1 кодирует целое число в формат BERT (вид двоичного формата, такого как thrift).Для простого теста вы должны использовать текстовый протокол с разбором:

не: Payload = term_to_binary(list_to_binary(integer_to_list(Param))),

, но: Payload = <<"hello, C++">>,

0 голосов
/ 18 октября 2011

Может быть, приемлемый обходной путь может быть IPC ? ZeroC имеет отличную поддержку C ++, и, похоже, приличная поддержка Erlang .

...