(* Сервер *)
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);
  end;

  (* Бесконечный цикл ожидания сообщений *)
  while true do
  begin
    (* Принимает сообщение и записывает адрес клиента *)
    if recvfrom (sockfd, c, 1, 0, tsockaddr(client), client_len) = -1 then
    begin
      perror ('Сервер: ошибка при приеме');
      continue;
    end;
    c := upcase (c);
    (* Посылает сообщение обратно *)
    if sendto (sockfd, c, 1, 0, tsockaddr(client), client_len) = -1 then
    begin
      perror ('Сервер: ошибка при передаче');
      continue;
    end;
  end;
end.
