Пример обработки пакетов для чтения / записи на C

StackOverflow https://stackoverflow.com/questions/1018030

  •  06-07-2019
  •  | 
  •  

Вопрос

Я немного новичок в C, но я сделал свою домашнюю работу (несколько руководств, книг и т.д.), И мне нужно запрограммировать простой сервер для обработки запросов от клиентов и взаимодействия с базой данных.Я просмотрел Руководство Beej по сетевому программированию, но я немного не уверен, как собрать воедино и обрабатывать различные части данных, отправляемых туда и обратно.

Например, предположим, что клиент отправляет некоторую информацию, которую сервер поместит в несколько полей.Как мне собрать воедино эти данные для отправки, а затем разбить их обратно на стороне сервера?

Спасибо,

Эрик

Это было полезно?

Решение

Если я правильно понимаю, вы спрашиваете: "как сервер понимает информацию, которую отправляет клиент"?

Если это то, о чем вы спрашиваете, то ответ прост:заранее согласовано, что структуры данных, которые использует каждый из них, будут совместимы.То есть.вы заранее решаете, каким будет ваш протокол связи.

Так, например, если у меня есть клиент-серверное приложение, где клиент подключается и может запрашивать такие параметры, как "время", "дата", и может сказать "settime " и "setdate", мне нужно написать свой сервер таким образом, чтобы он понимал эти команды.

Очевидно, что в приведенном выше случае это тривиально, поскольку это был бы просто текстовый протокол.Но допустим, вы пишете приложение, которое будет возвращать структуру информации, т. е.

struct Person {
    char* name;
    int age;
    int heightInInches;
    // ... other fields ...
};

Вы могли бы записать всю структуру целиком с сервера / клиента.В этом случае есть несколько вещей, о которых следует знать:

  1. Вам нужно правильно использовать hton /ntoh
  2. Вам нужно убедиться, что ваш клиент и сервер оба могут понимать рассматриваемую структуру.
  3. Вам может потребоваться выравнивание по границе 4B, а может и не потребоваться (потому что, если вы этого не сделаете, разные компиляторы C могут выполнять разные действия, что может привести к разрыву между клиентом и сервером, а может и нет).

В целом, однако, при написании клиент-серверного приложения самое важное, что нужно сделать правильно, - это протокол связи.

Однако я не уверен, что это вполне отвечает на ваш вопрос.Это то, что вам было нужно, или вы спрашивали больше о том, как именно вы используете функции отправки / recv?

Другие советы

Во-первых, вы определяете, как будет выглядеть пакет - какая информация будет в нем.Убедитесь, что определение составлено в формате, не зависящем от архитектуры.Это означает, что вы указываете его в последовательности, которая не зависит, например, от того, является ли машина с большим или с меньшим порядковым номером, а также от того, компилируетесь ли вы с 32-разрядным long или 64-разрядный long ценности.Если содержимое имеет переменную длину, убедитесь, что определение содержит информацию, необходимую для определения длины каждой части - в частности, каждой части переменной длины должно предшествовать подходящее количество ее длины.

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

Этот буфер будет отправлен по проводу получателю, который считает его в другой буфер, а затем обратит процесс вспять, чтобы получить информацию из буфера в локальные переменные.

Существуют такие функции, как ntohs() для преобразования из сетевого формата ('n') в формат хоста ('h') для 'короткого' (что означает 16-разрядное) целого числа и htonl() для преобразования из "длинного" хоста (32-битное целое число) в сетевой формат - и т.д.

Одна хорошая книга для нетворкинга - это Стивенс "Сетевое программирование UNIX, том 1, 3-е издание".Вы можете узнать больше об этом на его веб-сайте, включая пример кода.

Как уже упоминалось выше, вам нужно заранее согласованное средство связи.Одна вещь, которая мне помогает, - это использовать xmls для общения.

например ,Вам нужно время, чтобы отправить время клиенту, а затем включить его в тег с именем time.Затем проанализируйте его на стороне клиента и прочитайте значение тега.

Самое большое преимущество заключается в том, что как только у вас есть анализатор на стороне клиента, даже если вам нужно отправить какую-то новую информацию, им просто нужно согласовать имя тега, которое будет проанализировано на стороне клиента.

Это помогает мне, я надеюсь, что это поможет и вам тоже.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top