новости сообщество форум вики
Erlang по-русски. Форум » Erlang »

передача данных через порт

(7 posts)

  1. abracadabra
    Участник

    читаю армстронга глава 12. ре?ил сделать передачу байтов через порт и странное поведение обнаружил во время передачи данных. Передаю этот поток байт { 131,108,0,0,0,1,98,0,10,0,13,106 } и обрабатываю ф-ей binary_to_term в итоге получаю о?ибку {'EXIT', {badarg, [{erlang,binary_to_term, [<<131,108,0,0,0,1,98,0,13,10,0,13>>, [safe]]}, вопрос в том откуда взялась ли?няя 13 и исчез 106. зато если передавать вот этот набор байтов { 131,108,0,0,0,1,98,0,19,0,13,106 } то все хоро?о проходит, а разница только в 9 байте (вместо 10 теперь 19). Комбинация 0 10 0 13 напоминает код конца строки в винде. но я же передаю не строку а набор байт через ф-ию read. вопрос конечно специфический - но вдруг повезет.

    ? еще такой вопрос. писал в свое время вопросы (и этот тоже) на erlang-questions@erlang.org и ни разу не получил ответа - кто нить имеет опыт общения с ними?

    СПАС?БО!!!

    Отправлено 1 год назад #
  2. не понятен протокол. ты передае?ь в порт терм, "мар?ализируя" его с помощью term_to_binary? порт отвечает "эхо", ты получае?ь и распаковывае?ь с помощью binary_to_port?

    желательно привести исходники.

    может ты экспериментировал с параметрами открытия порта? (binary/line)

    Отправлено 1 год назад #
  3. abracadabra
    Участник

    вот сипипи файл компилил на ВС2003

    #include <io.h>
    #include <stdlib.h>

    typedef unsigned short UInt16;
    typedef unsigned char byte;

    static void Write2(const byte* pBuf, UInt16 len)
    {
    byte blen[2] = { byte((len >> 8) & 0xff), byte((len >> 0) & 0xff) };
    write(1, blen, 2);
    write(1, pBuf, len);
    }

    int main(void)
    {
    // This combination of bytes delivers incorrect via stdio (read\write)
    byte b[] = { 131,108,0,0,0,1,98,0,10,0,13,106 };
    //byte b[] = { 131,108,0,0,0,1,98,0,19,0,13,106 };
    Write2(b, sizeof(b));

    return 0;
    }

    а вот вызов через оболочку
    448> Port = open_port({spawn_executable, "C:\\SendEx_Err.exe"}, [binary, {packet, 2}, use_stdio])
    448> .
    #Port<0.6311>
    449> flush().
    Shell got {#Port<0.6311>,{data,<<131,108,0,0,0,1,98,0,13,10,0,13>>}}
    ok

    отчетливо видно что берется откуда то ли?няя 13 и куда то девается 106. но если взять второй бинарник с числом 19 а не 10 - то все четко работает.

    ? все-таки у кого есть опыт общения с этими перцами?

    Отправлено 1 год назад #
  4. Попробовал под линупсом, все работает. Похоже под виндой write "неправильный" и самостоятельно превращает "\n" в "\r\n". Судя по всему erlang здесь вообще ни при чем, перенаправь вывод SendEx_Err.exe в файл, открой каким нибудь бинарным редактором и посмотри, почти уверен что там будет те самые 13 10 ("\r\n").

    Отправлено 1 год назад #
  5. под линухом работает нормально,
    это проблема виндовой платформы - проверил на паре компиляторов (Borland и Microsoft) - они вставляют 13 перед 10.

    Отправлено 1 год назад #
  6. abracadabra
    Участник

    Народ! огромное спасибо за участие! меня тут натолкнуло на мысль что видимо можно как то управлять этим и действительно в хедерах на?ел подходящую ф-ию. надо сначала задать режим вывода а иначе он по умолчанию идет как текст.
    _setmode( _fileno( stdout ), _O_BINARY );

    теперь все работает как надо!
    еще раз спасибо!

    Отправлено 1 год назад #
  7. Всем привет. Последнее время увлёкся Erlang-ом,пока ещё в нём очень слаб, наткнулся на тупик. Кто нибудь может подсказать, как номер порта задать для сервера на Erlang-е ?

    Отправлено 8 мес. назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.

 
 

так же

Популярные тэги



Currently online

No Members around.

twitter