Пример обработки чтения / записи пакетов в C - PullRequest
3 голосов
/ 19 июня 2009

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

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

Спасибо

Эрик

Ответы [ 3 ]

4 голосов
/ 19 июня 2009

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

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

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

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

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

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

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

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

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

3 голосов
/ 19 июня 2009

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

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

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

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

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

0 голосов
/ 19 июня 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...