Системное программирование в UNIX средствами Free Pascal



         

Описание


uses sockets;

Function Recv(sockfd:Longint; Var buffer; length,Flags:Longint):Longint;

Function Send(sockfd:Longint; Var buffer; length,Flags:Longint):Longint;

Вызов recv имеет четыре параметра: дескриптор файла filedes, из которого читаются данные, буфер buffer, в который они помещаются, размер буфера length и поле флагов flags.

Параметр flags указывает дополнительные опции получения данных. Его возможные значения определяются комбинациями следующих констант:

MSG_PEEK

Процесс может просматривать данные, не «получая» их

MSG_OOB

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

MSG_WAITALL

Возврат из вызова recv произойдет только после получения всех данных

При аргументе flags равном нулю вызов send работает точно так же, как и вызов write, пересылая массив данных буфера buffer в сокет sockfd. Параметр length задает размер массива данных. Аналогично вызову recv параметр flags определяет опции передачи данных. Его возможные значения определяются комбинациями следующих констант:

MSG_OOB

Передать срочные (out of band) данные

MSG_DONTROUTE

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

Теперь с помощью этих вызовов можно реализовать обработку данных на серверной стороне:

(* Серверный процесс *)

var

  c:char;

  client:tinetsockaddr;

  clientaddrlen:longint;

begin

  (* Приведенная выше инициализация сокета *)

  .

  .

  .

  while true do

  begin

    (* Принимает запрос на установку соединения *)

    newsockfd := accept (sockfd, client, clientaddrlen);

    if newsockfd = -1 then

    begin

      perror ('Ошибка вызова accept');

      continue;

    end;

    (* Создает дочерний процесс для работы с соединением *)




Содержание  Назад  Вперед