закрываем для надежности ненужные каналы:
exit;
end;
if not assignpipe(in2,out2) then
begin
writeln('Ошибка создания второго программного канала');
fdclose(in1); (*закрываем ранее созданный канал 1*)
fdclose(out1);
exit;
end;
pid:=fork; (*клонирование процесса*)
if pid=-1 then (*ошибка клонирования*)
begin
writeln('Ошибка создания потомка');
exit;
end;
if pid=0 (*сервер - потомок*) then (*ветка потомка*)
begin
fdclose(out1);(* закрываем для надежности ненужные каналы:
первый - для записи, второй - для чтения*)
fdclose(in2);
fdread(in1,filename,80); (*читаем из первого канала имя файла*)
{}writeln('Сервер: получено имя файла - ',filename);
if access(filename,f_ok or r_ok) then (*если файл существует и доступен для чтения*)
begin
fstat(filename,st);(*получем информацию о файле*)
filesize:=st.size; (*узнаем размер файла*)
{}writeln('Сервер: определен размер файла - ',filesize);
fdwrite(out2,filesize,sizeof(filesize)); (*пишем во второй канал размер файла*)
{}writeln('Сервер: размер файла записан в канал');
fd:=fdopen(filename,Open_RDONLY);(*открываем файл для чтения*)
i:=1;
kol:=fdread(fd,buf,BLOCKSIZE); (*читаем блоками по BLOCKSIZE байт*)
while kol>0 do
begin
fdwrite(out2,buf,kol); (*пишем во второй канал столько, сколько прочли из файла*)
{}writeln('Сервер: записано в канал ',i*kol/BLOCKSIZE:1:1,' Kb');
kol:=fdread(fd,buf,BLOCKSIZE);
end;
fdclose(fd);(*закрываем файл*)
{}writeln('Сервер: файл записан в канал');
end
else (*если файл не существует или недоступен для чтения*)
begin
filesize:=-1; (*записываем в программный канал признак ошибки*)
fdwrite(out2,filesize,sizeof(filesize));
end;
{}writeln('Сервер: работа завершена');
halt(0); (*завершаем работу потомка*)
end
else (*клиент - родитель*) (*ветка родителя*)
begin
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий