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


         

Описание


uses stdio;

function recvfrom(sockfd:longint; var message; length, flags:longint;

                  var send_addr:tsockaddr; var add_len:longint):longint;

function sendto(sockfd:longint; var message; length, flags:longint;

                var dest_addr:tsockaddr; dest_len:longint):longint;

Если параметр send_addr равен nil, то вызов recvfrom работает точно так же, как и вызов recv. Параметр message указывает на буфер, в который помещается принимаемая дейтаграмма, а параметр length задает число байтов, которые должны быть считаны в буфер. Параметр flags принимает те же самые значения, что и в вызове recv. Два последних параметра помогают установить двустороннюю связь с помощью UDP-сокета. В структуру send_addr будет помещена информация об адресе и порте, откуда пришел прочитанный пакет. Это позволяет принимающему процессу направить ответ пославшему пакет процессу. Последний параметр является указателем на целочисленную переменную типа longint, в которую помещается длина записанного в структуру send_addr адреса.

Вызов sendto противоположен вызову recvfrom. В этом вызове параметр dest_addr задает адрес узла сети и порт, куда должно быть передано сообщение, а параметр dest_len определяет длину адреса.

Адаптируем пример для модели дейтаграммных посылок.

(* Сервер *)

uses sockets,linux,stdio;

const

  SIZE=sizeof(tinetsockaddr);

  (* Локальный серверный порт *)

  server:tinetsockaddr = (family:AF_INET; port:7000; addr:INADDR_ANY);

  client_len:longint=SIZE;

var

  sockfd:longint;

  c:char;

  (* Структура, которая будет содержать адрес процесса 2 *)

  client:tinetsockaddr;

begin

  (* Установить абонентскую точку сокета *)

  sockfd := socket (AF_INET, SOCK_DGRAM, 0);

  if sockfd = -1 then

  begin

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

    halt (1);

  end;

  (* Связать локальный адрес с абонентской точкой *)

  if not bind (sockfd, server, SIZE) then

  begin

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

    halt (1);




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