Я использую соединение TCP для отправки данных на сервер C ++. Я читал о библиотеке ei, которая при наличии двоичного файла имеет набор функций для получения декодированного значения из двоичного файла. Egs, ei_decode_string, ei_decode_long и другие.
Я пытаюсь сделать эти простые вещи:
1. создать сокет и подключиться к нему.
{ok, Socket} = gen_tcp:connect({127,0,0,1}, 8986, []).
2. Используйте gen_tcp: send / 2 для отправки данных.
gen_tcp:send(Socket, term_to_binary("Stackoverflow")).
Поэтому я отправляю двоичный формат строки на сервер.
Мой сервер, код C ++, получает данные, и я пытаюсь получить все, что клиент отправляет мне через сокет, используя ei_decode_string, например:
В идеале, при декодировании я должен получить обратно строку «Stackoverflow», поскольку я сказал ему decode_as_string из двоичного файла. Убедитесь, что у меня достаточно места в полученном буфере.
char *p = (char*)malloc(sizeof(char) * 100);
int index = 0;
int decoded = ei_decode_string(buff, &index, p);
cout<<"The decoded value is "<<p<<endl;
Я не могу расшифровать строку, которую я отправил. Я что-то пропустил? Как я могу отправлять данные и декодировать их на стороне сервера, если это не правильный подход.
Спасибо вам за помощь!
1> term_to_binary("Stackoverflow").
<<131,107,0,13,83,116,97,99,107,111,118,101,114,102,108,
111,119>>
Здесь первый элемент в двоичном коде — это не строка в виде маленьких целых чисел, а номер версии (131), как описано в Внешний термин Формат. После этого идут термины, каждый с префиксом тега, а затем соответствующие данные. В этом случае тег 107 STRING_EXT
два байта для длины (13) и затем 13 8-битных целых, первое 83 соответствует букве ‘S’ (83 в ascii).
Чтобы правильно обработать этот двоичный файл, позвоните ei_decode_version
должно быть раньше ei_decode_string
int ei_decode_version (const char * buf, int * index, int * version)
Эта функция декодирует магическое число версии для двоичного файла erlang.
термин формат. Это должен быть первый токен в двоичном члене.
Других решений пока нет …