Как обработать сетевой порядок байтов в C - PullRequest
0 голосов
/ 13 ноября 2018

У меня вопрос по поводу C и порядка байтов.Я программирую небольшой TCP-сервер, который получает сообщение.Однако у меня проблемы с получением сообщений.Я могу найти только примеры TCP передачи строк.Тем не менее, мое сообщение включает в себя одиночные переключенные биты.

recv(socketClient, buffer, strlen(buffer), 0);

Я специально спрашиваю следующее: Какой тип мне нужен для инициализации буфера и как мне затем обрабатывать его (разделить его на массив из различных целых чисел)?т.е..

Мой текущий метод для строк:

int max_size = 512;

char buffer[max_size];// buffer to read server message
memset(buffer, ' ', sizeof(buffer)); //fill buffer memory with an empty char

1 Ответ

0 голосов
/ 14 ноября 2018

Чтобы ответить на ваши вопросы в первую очередь:

С каким типом мне нужно инициализировать буфер

По «типу» я предполагаю, что вам действительно нужно значение, как вчем вы инициализируете буфер.Чтобы ответить - вам не нужно заполнять его какой-то известной ценностью вообще.Возвращаемое значение функции recv сообщает вам, сколько байтов вы получили.Все в этом количестве является действительными данными, все остальное вы можете рассматривать как мусор и можете использовать оставшееся пространство, например, для завершения строки нулем.Предполагая, что вы передаете только строки, конечно.

как мне затем обработать его (разбить его на массив различных целых чисел, т. Е.)

Вот что делают протоколы и методы сериализациис.В них рассказывается о вещах, таких как одер, в котором передаются данные, как их интерпретировать, а также о том, как преобразовать данные, хранящиеся в вашей программе, в байтовый буфер (аргумент send), а затем о том, как преобразовать их обратно вполучите те же данные, что и перед преобразованием (чтение из recv).

Теперь уточним, учитывая ограниченные данные, приведенные в вопросе: если вы не обмениваетесь данными с хостом, который, как вы знаете, использует определенный протокол (HTTP, например) или передает данные в каком-то известном формате (например, JSON) и, следовательно, может использовать какую-то библиотеку, чтобы выполнить эту работу за вас, вы реализуете сериализацию и десериализацию самостоятельно.Короче говоря - вы должны знать, как удаленный конец преобразовал данные, которые он отправил в байтовый буфер, и вы делаете те же операции в обратном порядке.Предполагая, что вы находитесь на той же платформе, что и подключенный хост, для очень быстрого подтверждения концепции вы можете пойти с memcpy, но дальше этого * я не рекомендую .Как вы поступите, это полностью зависит от вас.Лично я бы порекомендовал изучить тему сериализации данных, начиная с простых примеров и создавая свой путь.Такая тема слишком широка, чтобы объяснить ее даже в минимальной форме в одном ответе.

...