LINUX.ORG.RU

работа с бинарными протоколами


0

0

Добрый день. Интересует такой вопрос: как правильно работать с бинарными протоколами (ну к примеру, socks4/5). Как я понимаю, простая запись полей в структуры может не пойти из-за различных выравниваний и т.п. (плохо в этом соображаю). Так вот, как бы правильно все это реализовать ?

★★★★★

или читать RFC на данный протокол или использовать библиотеку для работы с данным протоколом,

какой еще ответ ты ожидал?

anonymous
()
Ответ на: комментарий от anonymous

Да я знаю, что надо передавать по протоколу. Интересует в какой форме это лучше сделать на СИ. К примеру, надо передать 4byte|1byte|len|string Можно это все упаковать в массив char и передать, а можно ли создать структуру, и уже ее передавать? В этом случае, как я понял, могут появиться проблемы с выравниванием структуры. Что в этом случае надо делать ?

roy ★★★★★
() автор топика

> Как я понимаю, простая запись полей в структуры может не пойти из-за различных выравниваний и т.п. (плохо в этом соображаю).

Выравнивание полей можно отключить с помощью #pragma (см. доку по компилятору). Или использовать массив char и работать с указателями.

DKorolkov
()
Ответ на: комментарий от DKorolkov

Щас тебе тут насоветуют.

Отключить прагмами можно выравнивание. А вот как быть с порядком байт?

Короче, если пихать в сеть структуры прямо из памяти - о переносимости такого софта можно сразу забыть.

anonymous
()

всё пойдёт.. делаешь упакованные структуры, о выравнивании заботишься сам (то есть ставишь если надо заполнители в структуру), перед отправкой конвертишь всё что надо в положенный по протоколу порядок, по приёму в принятый на хосте (htonX/ntohX функции).. пример упакованных струкур подсмотри например в tcp.h

PS : это всё чтобы самому разобраться и сделать что-то своё, а на практике, если есть готовый API к протоколу то его и используют.

MKuznetsov ★★★★★
()

struct packet
{
  int x;
  int y;
  char z;
}


p = malloc(sizeof packet);

p.x = 10;
p.y = 11;
p.z = 'A';

man send читаешь дальше

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.