и несколько клиентов. Как сервер
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.
Новый текст клиента:
(* Клиентский процесс *)
uses sockets,stdio,linux;
const
SIZE=sizeof(tinetsockaddr);
(* Локальный порт на клиенте *)
client:tinetsockaddr = (family:AF_INET; port:INADDR_ANY; addr:INADDR_ANY);
(* Адрес удаленного сервера *)
server:tinetsockaddr = (family:AF_INET; port:7000);
var
sockfd:longint;
c:char;
begin
(* Преобразовать и записать IP адрес *)
server.addr := inet_addr ('127.0.0.1');
(* Установить абонентскую точку сокета *)
sockfd := socket (AF_INET, SOCK_DGRAM, 0);
if sockfd = -1 then
begin
perror ('Ошибка вызова socket');
halt (1);
end;
(* Связать локальный адрес с абонентской точкой сокета. *)
if not bind (sockfd, client, SIZE) then
begin
perror ('Ошибка вызова bind');
halt (1);
end;
(* Считать символ с клавиатуры *)
while fdread (0, c, 1) <> 0 do
begin
(* Передать символ серверу *)
if sendto (sockfd, c, 1, 0, tsockaddr(server), SIZE) = -1 then
begin
perror ('Клиент: ошибка передачи');
continue;
end;
(* Принять вернувшееся сообщение *)
if recv (sockfd, c, 1, 0) = -1 then
begin
perror ('Клиент: ошибка приема');
continue;
end;
fdwrite (1, c, 1);
end;
end.
Упражнение 10.4. Запустите сервер и несколько клиентов. Как сервер определяет, от какого клиента он принимает сообщение?
Содержание Назад Вперед