среда, 2 мая 2012 г.

UDP эхо-сервер и клиент на блокирующих сокетах

В последнее время я получил уже несколько однотипных жалоб со стороны знакомых разработчиков, заключающиеся в том, что в инете нормальных примеров по сетям, реализованных на Sockets API, почти не найти, а то что есть, то это в основном простенькие, сделанные на тяп-ляп при помощи компонентов, UDP чаты и не более того( конечно мой чатик к этому не относится :] )

Поэтому я уделил время новой статейке из серии сетевого программирования, в которой решил описать структуру пусть даже и простого эхо-сервера, но зато уже с ориентацией на учёт и обработку подключений. Поэтому думаю что многие заметят в этом полезное деяние)

В данной статье будет рассмотрена разработка сервера и клиента на протоколе UDP средствами стандартных сокетов(сокеты Беркли) в блокирующем режиме.
Для определения готовности сокетов будет использоваться функция select().

Логически предшествующие статьи:
  Введение в протокол UDP и пример с исходниками простого чата.


4 комментария:

  1. на счёт того, что надо конвертировать record в массив байт - фигня. я конвертирую через Move только данные структуры пакета, но сам пакет передаю напрямую в SendTo
    TPacket = record
    CMD : Word;
    Buffer : TDataBuffer; // массив байт
    end;
    сам такой пакет я отправляю, а данные других переменных и структур заношу через Move в Buffer

    ОтветитьУдалить
    Ответы
    1. Ну и молодцом) Только получается у тебя то же самое о чём я и сказал, просто массив, который у меня в примере называется arr и помещается в буфер сокета, ты назвал в своём примере Buffer и поместил его в рекорд, который помещаеш в буфер сокета.

      Удалить
    2. я хотел сказать, что необязательно приводить в массив байт переменные. можно хоть record напрямую передавать в SendTo, RecvFrom

      Удалить
    3. да, конечно. теперь я понял, что у меня чрезмерно утвердительно было написано про конвертацию в массив. подрпавил этот абзац.
      Грубо говоря, функции send() и sendto() - это как move(), которая копирует данные в буфер сокета.

      Удалить