summaryrefslogtreecommitdiffstats
path: root/lib/libftp/doc/rus.tex
blob: 2361c111e674975bd0e78bab86d1409aa79af64f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
\documentstyle[russian,fancyheadings,twoside,epsf,indentfirst]{article}
% Vertical sizes
%\vsize=20cm
%\voffset=-2.3cm
%\topmargin=0cm
%\headheight=0.9cm
%\footskip=1cm
%\footheight=0.9cm
%\textheight=16cm
%\headrulewidth 0.01cm
%\footrulewidth 0.0cm
% horisontal sizes
%\hsize=30cm
%\hoffset=-4.3cm
%\hoffset=-2.3cm	
%\textwidth=13cm
% Modes
% \special{landscape}
\pagestyle{empty}
\pagestyle{fancyplain}
\newcommand{\tit}[1]{#1}
\rhead[\fancyplain{}{\tit{\leftmark}}]{\fancyplain{}{\tit{\rightmark}}}
\lhead[\fancyplain{}{\tit{\rightmark}}]{\fancyplain{}{\tit{\leftmark}}}
\chead{\hfill}
\lfoot[\fancyplain{}{\tit{\thepage}}]{\fancyplain{}{\hfill}}
\rfoot[\fancyplain{}{\hfill}]{\fancyplain{}{\tit{\thepage}}}
\cfoot{\hfill}
\renewcommand{\sectionmark}[1]{\markboth{#1}{\ }}
\renewcommand{\subsectionmark}[1]{\markright{\ }}
\newcommand{\look}[1]{(Глава~\ref{#1}, стр.~\pageref{#1})}
\newcommand{\toindex}[1]{\underline{\bf#1}\index{#1}}
\newcommand{\add}[1]{\symbol{64}}
\newcommand{\ps}[1]{\symbol{37}s}
\newcommand{\twcol}[4]{
\noindent\parbox[t]{#1\textwidth}{#3} \hfill \parbox[t]{#2\textwidth}{#4\hfill}\\
}
\newcommand{\tc}[2]{\twcol{0.49}{0.49}{#1}{#2}}
\newcommand{\tcc}[2]{\twcol{0.49}{0.49}{\toindex{#1}}{#2}}
\newcommand{\ttt}[2]{\bigskip

{\bf#1}

#2}
\newcommand{\ts}[1]{{\bf#1}}
\newcommand{\dl}[2]{\parbox[t]{0.4\textwidth}{#1\hfill}\hfill
                    \parbox[t]{0.4\textwidth}{#2\hfill}}
\makeindex
\begin{document} 
\title{\bf\it РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ БИБЛИОТЕКИ "LIBFTP"}
\author{Олег Орел}
\date{\today}
\newpage 
\maketitle

\section*{Лицензия}

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

Коммерческое использование этой библиотеки  возможно с привлечением
е\"е автора.

\section*{Причины создания и история развития}

Для людей, которые хотя бы один раз писали программу с использованием
системных вызовов типа socket, connect, bind.... не секрет, что почти всегда 
последовательность вызовов функций для создания соединения по протоколу TCP одна и та же. Отсюда возникает резонный 
вопрос ``А почему собственно не иметь библиотеки более высокого 
уровня, для упрощения процесса программирования?''.
Это послужило причиной создания \ts{libftp}.

После реализации ``нижней'' части библиотеки, были созданы
функции более высокого уровня, такие как 
передача целого файла или чтение списка файлов. При написании
этих процедур возникла необходимость удобной отладки сбойных случаев,
для освобождения программы от бесконечного числа условий 
(обработка возвращаемого 
библиотечными функциями статуса).
Для этого был создан макрос \ts{EXIT}, который при возврате функциями статуса,
проверяет его, и в случае необходимости вызывает заранее установленные 
функции.

При передачи файлов по сети, которая в основном состоит из dialup-slip'ов
(типичная ситуация для exUSSR) 
часто возникают ситуации ``поломки сети'' и файл большого размера передать
становится практически невозможно\footnote{Конечно можно периодически
запускать ftp, и говорить в нем ``reget filename''}, это послужило причиной 
написания программы \toindex{ftptry}\footnote{Программа \ts{ftptry} будет описана ниже} с использованием библиотеки libftp.
Для е\"е реализации в библиотеку были добавлены функции 
\toindex{FtpRestorTimeout} и \toindex{FtpReretrTimeout}, 
которые в отличии от функций \ts{FtpStorTimeout} и \ts{FtpRetrTimeout} 
не передают а докачивают файлы.   

\section*{Недостатки - для исправления в следующих версиях}

\begin{itemize}

\item В процедурах чтения потока из socket'ов используется механизмы
setjmp-longjmp, alarm+SIGALRM, SIGIO, которые будут заменены на select. 
Этот недостаток (использование SIGALRM) проявляется при работе с X11
\footnote{там тоже используется alarm}

\item Переменная FtpDataStart\footnote{С какого байта передавать файлы} не принадлежит структуре FTP, а является обшей для всех.

\item Отсутствие работы с \toindex{site-specific} ftpd командами
\end{itemize}
 
\section*{Идеи для дальнейших реализации}

\begin{itemize}

\item  Разработка программы  дублирования дерева
директорий одной машины на другую. \footnote{Разработка идет в данный момент}

\item Разработка интерфейса в окружении X-window's для манипуляции 
файлами находящихся на разных машинах с возможностью неинтерактивной передачи 
(для медленных сетей)

\item Создание мультиплексирующего аппарата для одновременной 
обработки нескольких потоков данных. 

\item Создание объекта FTP для C++

\end{itemize}

\section*{Введение}

Библиотека ``libftp'' предназначена для написания прикладных программ в которых
существует необходимость передавать файлы по сети TCP/IP. Oна
является набором функций начиная от примитивных функций, таких как открытие соединения по протоколу FTP на удаленную машину, до функций высокого уровня, которые передают 
файлы сами производя соединение/разъединение с сервером. 
Все функции имеют прототипы в файле \toindex{FtpLibrary.h}, 
который должен быть помещен
в каталог стандартных заголовков\footnote{Например /usr/include}. 
Эти прототипы практически полностью описывают
назначение функций  и их аргументы, но тем не менее необходимо сказать об общей идеологии
построения библиотеки и ее компонент. 

Вся библиотека, являясь клиентом, использует
с противоположной стороны соединения стандартный \toindex{FTPD}
\footnote{Для работы функций FtpRertrTimeout, FtpRestorTimeout необходимо
чтобы сервер отрабатывал команду REST}.

Во многих операционных системах существует проблема обработки 
разного рода ошибок, в том числе ошибок 
ввода/вывода, в данном инструментарии использован единый механизм возврата 
результата работы любой функции  (макрокоманда \ts{EXIT}, определенная в \ts{FtpLibrary.h}) 
который позволяет 
предварительно установив свои или стандартные функции обработки 
ошибок и функции
отладки, писать смысловую часть программы, думая только о ее методе работы 
в идеальных условиях. В функциях передачи данных в обе стороны существует
возможность установить максимальное время ожидания потока данных, по истечении которого, возможно вызвать определенную процедуру. 


При работе с библиотекой, первой всегда вызывается процедура 
соединения с сервером\footnote{За исключением FtplibDebug} (\ts{FtpLogin} или \ts{FtpConnect})
которая возвращает указатель на вновь созданную структуру данных (типа \ts{FTP})  
о соединении с сервером. 




\section{Структура данных FTP}


\tc{int \toindex{sock}}{--- дескриптор канала передачи команд на сервер;}
\tc{FILE *\toindex{data}}{--- описание канала для передачи данных на сервер;}
\tc{int \toindex{errno}}{ --- значение последнего возвращенного библиотекой значения.
                        В случае если оно отрицательно или равно нулю, 
                        то произошла ошибка;}
\tc{char \toindex{mode}}{--- тип передачи данных;}
\tc{int ch}{--- вспомогательная переменная используемая для преобразования
                        потока в режиме передачи текстовых файлов;}
\tc{STATUS (*func)()}{--- адрес функции, которая вызывается в случае когда от сервера
                        получен ответ об ошибке;}
\tc{STATUS (*debug)()}{--- адрес функции, которая вызывается для отладки протокола;}
\tc{STATUS (*IO)()}{--- функция вызываемая в случае потери связи с сервером, или
                        по истечению максимального времени на прием/передачу одного
                        символа.}
 

\section{ Процедуры соединения/разъединения с сервером}

\ttt{STATUS \toindex{FtpConnect}(FTP~**, char~*hostname
\footnote{Имя машины может быть как символьное так и цифровое, например 
\ts{dxcern.cern.ch} или \ts{128.141.201.96}}
)}
{
  Создает канал соединения с сервером, находящимся на машине  hostname,
  и создает структуру FTP, возвращая на нее указатель. Если предварительно
  была выполнена процедура \toindex{FtplibDebug}(1), 
  то до соединения с сервером включает стандартные
  подпрограммы обработки ошибок \toindex{FtpDebugDebug}, \toindex{FtpDebugError}, 
  \toindex{FtpDebugIO} \look{debug}.
}
\ttt{STATUS \toindex{FtpUser}(FTP~*, char~*user)}
{
 Посылает серверу имя пользователя. Ранее должно было быть произведено соединение
}

\ttt{STATUS \toindex{FtpPassword}(FTP~*, char~*password)}
{
 Посылает серверу пароль. Ранее должна была быть выполнена процедура \ts{FtpUser} 
}\ttt{STATUS \toindex{FtpAccount}(FTP~*, char~*acct)}
{
 Посылает серверу имя account'a Эта функция сделана для полного соответствия
 библиотеки протоколу \ts{FTP}, но т.к. мало таких операционных систем в которых необходим этот 
 атрибут пользователя то функция \ts{FtpAccount} в общем то не нужна.
 Предварительно должна была быть выполнена процедура
 \ts{FtpUser}.
}

\ttt{
STATUS \toindex{FtpLogin}(FTP~**, char~*hostname, char~*user, char~*password, char~*account)}
{
  Последовательно выполняет процедуры \ts{FtpConnect}, \ts{FtpUser}, \ts{FtpPassword}, \ts{FtpAccount} 
(если параметр account равен NULL, то процедура FtpAccount не вызывается)}

\ttt{STATUS \toindex{FtpBye}(FTP~*)}
{ Завершает сеанс работы с сервером \footnote{Как видно из описания процедур соединения/разъединения из одной программы можно одновременно соединятся с несколькими серверами} }




\section{Процедуры отладки программы} \label{debug} 

Существует возможность предварительно определить три 
процедуры:~\footnote{Если в любую из функций, описанных ниже, вместо параметра function передать значение \ts{NULL}, то это будет означать
отключение отладки. При отключенной отладке результат работы можно 
определить или же по возвращаемому функцией значению (Если она типа \toindex{STATUS}) или 
по переменной errno в структуре \ts{FTP}}

\ttt{\toindex{FtpSetDebugHandler}(FTP *,function)}
{  Устанавливает процедуру отладки протокола с удаленным сервером. 
   Если ее определить, то она всегда будет вызывается из стандартной функции 
   приема/передачи сообщения с/на сервера. Должна делать возврат, но в принципе
   имеет полное право прерывать выполнение программы в случае необходимости.
}

\ttt{\toindex{FtpSetErrorHandler}(FTP *,function)}
{
   Определяет функцию обработки ошибок.
   После ее определения, в случае возвращения сервером
   неудовлетворительного ответа, будет вызываться указанная функция. 
   При этом знак у кода ошибки меняется на '-', и т.о. результат 
   становится меньше нуля.
}
\ttt{\toindex{FtpSetIOHandler}(FTP *,function)}
{
   Определение функции обработки ошибок ввода/вывода.
   При передаче данных или команд на сервер, может возникнуть ситуация когда 
   связь с сервером будет потеряна (сюда входят практически все сбои сети 
   и сбои при работе сервера на удаленной машине) при этом будет вызвана
   указанная функция. Она  вызывается так же по истечению
   максимального времени при ожидании очередного символа с сервера во время
   передачи данных. (\toindex{timeout})
}

\ttt{\toindex{FtpDebug}(FTP *)}
{
Подключение стандартных функций отладки протокола таких как 
\tc{\toindex{FtpDebugError}}{--- печатает строку возвращенную сервером и прерывает программу;}
\tc{\toindex{FtpDebugDebug}}{--- печатает строку возвращенную сервером;}
\tc{\toindex{FtpDebugIO}}{--- печатает строку \ts{strerror(errno)} и прерывает программу.}
}

Во все процедуры передаются три аргумента:\\
1. Структура \ts{FTP};\\
2. Значение возвращенное функцией, если оно меньше единицы то произошла ошибка;\\
3. Символьное сообщение об ошибке (char *).

\ttt{\toindex{FtplibDebug}(\ts{on} or \ts{off})}
{	Включает/выключает автоматическое включение всех видов отладки при 
        выполнении функции \ts{FtpConnect(FtpLogin)}}
\section{Процедуры передачи данных с сервера}

\ttt{STATUS  \toindex{FtpRetrTimeout}(FTP~*, char~*command, char~*inp, char~*out
\footnote{Если имя локального файла \ts{out} совпадет со строками \ts{*STDIN*}, \ts{*STDOUT*}, \ts{*STDERR*} то 
вместо открытия нового файла произойдет дублирование потока соответственно с каналами 
\ts{stdin}, \ts{stdout}, \ts{stderr} (Обработку данной спецификации файлов 
производит функция \toindex{Ftpfopen}, которая при необходимости может быть вызвана самостоятельно, с такими же аргументами, как системная функция fopen)},
 long~time)}
{
	Посылает команду \ts{command} на сервер, причем если в команде 
        встретится подстрока \ps, то на ее место будет подставлена строка \ts{inp}.
        Создает канал для передачи данных, и то что будет передано
	сервером в этот канал будет скопировано в локальный файл \ts{out}. 
        Если в течении времени \ts{time}(в секундах)
	 с сервера не придет не одного символа, то 
        функция возвратит статус который будет означать ошибку ввода/вывода.
	В случае когда \toindex{timeout}=0, 
        максимальное время ожидания на уровне библиотеки равно
        бесконечности, в этом случае ошибка ввода/вывода  может возникнуть
        по истечению timeout'a в ядре TCP/IP (или системы). Таким образом, если \ts{timeout} в 
	параметре time больше чем timeout в ядре TCP/IP, он никогда 
        не прервет передачу данных. \footnote{\ts{Timeout} в ядрах разных TCP/IP(системах) разный} 
}

\ttt{STATUS  \toindex{FtpReretrTimeout}(FTP~*, char~*command, char~*inp, char~*out, long~time)}
{
	Производит тo же сaмое действие что и функция \ts{FtpRetrTimeout}, за 
исключение того, что перед передачей проверяется файл \ts{out}, и в случае
его существования передача с сервера начинается с байта с номером \ts{<размер файла out>}+1.}
\ttt{\toindex{FtpRetr}(FTP~*, char~*command, char~*inp, char~*out)}
{
 Вызывает то же действие что и FtpRetrTimeout, но с выключенным timeout'ом.
}

\ttt{\toindex{FtpGetTimeout}(FTP~*, char~*inp, char~*out, long~time)}
{
 Передает с сервера файл \ts{inp} в локальный файл \ts{out}, при этом устанавливается
 \ts{timeout=time}.
}

\ttt{\toindex{FtpGet}(FTP~*, char~*in, char~*out)}
{
 Вызывает функцию \ts{FtpGetTimeout} с выключенным максимальным временем 
ожидания данных}

\ttt{\toindex{FtpDirectory}(FTP~*, char~*pat\footnote{Это первый аргумент для команды ls(dir)}, char~*out)}
{
 Передает содержимое директории, описанного параметром \ts{pat}, с сервера в файл \ts{out}.
}
\ttt{\toindex{FtpDir}(FTP~*, char~*out)}
{
 Передает содержимое текущей директории с сервера в файл \ts{out}.
}

\section{Процедуры передачи данных на сервер}

\ttt{\toindex{FtpStorTimeout}(FTP~*, char~*command, char~*inp, char~*out, long~time)}
{
  Передает содержимое локального файла \ts{inp} на сервер, предварительно послав 
ему команду, составленную из \ts{command} и \ts{out}. Параметр \ts{time}, задает максимальное
время на отправку одного символа. 
}

\ttt{STATUS  \toindex{FtpRestorTimeout}(FTP~*, char~*command, char~*inp, char~*out, long~time)}
{
	Производит тo же сaмое действие что и функция \ts{FtpStorTimeout}, за 
исключение того, что перед передачей проверяется файл \ts{out} на сервере, 
и, в случае его существования, передача на сервер начинается с байта с номером \ts{<размер файла out>}+1.}

\ttt{\toindex{FtpStor}(FTP~*, char~*command, char~*inp, char*~out)}
{
  Вызывает запуск процедуры \ts{FtpStorTimeout} с параметром \ts{time=0}.
}

\ttt{\toindex{FtpPutTimeout}(FTP~*, char~*in, char~*out, long~time)}
{ Передает локальный файл \ts{in} на сервер в файл с именем \ts{out}, при этом \ts{timeout=time}}

\ttt{\toindex{FtpPut}(FTP~*, char~*in, char~*out)}
{
  Вызывает процедуру \ts{FtpPutTimeout} с параметром \ts{time=0}}


\section{Процедуры чтения/записи в файл на сервере}

Для того, чтобы производить ввод/вывод из/в файлы которые находятся на сервере, 
причем не копируя их предварительно в локальный файл, а работая непосредственно с оригиналом, 
существует возможность открыть файл на сервере на чтение/запись/дозапись и
затем с помощью обычных процедур ввода/вывода или же при помощи процедур
\ts{FtpRead} и \ts{FtpWrite}, которые в отличии от первых преобразуют текстовые файлы, 
производить необходимые операции.
\footnote{Естественно, такие функции как \ts{seek}, \ts{ioctl}, ... 
          для этих файлов недопустимы.}


\ttt{\toindex{FtpData}(FTP~*, char~*command, char~*param, char~*mode)}
{ Создает канал для передачи данных предварительно послав серверу команду которая
составляется из параметров \ts{command} и \ts{param}. Параметр \ts{mode} указывает может быть 
или ``r'' или ``w''}

\ttt{\toindex{FtpOpenRead}(FTP~*,char~*filename)}
{ Открывает для чтения файл с именем \ts{filename} на сервере }

\ttt{\toindex{FtpOpenWrite}(FTP~*,char~*filename)}
{ Открывает для записи файл с именем \ts{filename} на сервере }

\ttt{\toindex{FtpOpenAppend}(FTP~*,char~*filename)}
{ Открывает для дозаписи файл с именем \ts{filename} на сервере }

\ttt{\toindex{FtpOpenDir}(FTP~*, char~*files)}
{
  Создает канал для чтения удаленного листинга директории, параметр files передается
команде \ts{ls} на сервере в качестве 1-го параметра
}

\ttt{int \toindex{FtpRead}(FTP~*)}{Читает символ из потока данных, если была установлена
 текстовая мода передачи \footnote{Установлена по умолчанию.}, преобразует переходы на новую строку. При обнаружении
конца потока возвращает \toindex{EOF}} 

\ttt{\toindex{FtpGetString}(FTP~*, char~*str)}
{ Чтение одной строки из потока данных при помощи функции \ts{FtpRead}.}

\ttt{\toindex{FtpWrite}(FTP~*, char~c)}{Пишет символ в поток данных, если была установлена
 текстовая мода передачи, преобразует переходы на новую строку. При обнаружении
ошибки ввода/вывода возвращает \toindex{EOF}} 

\ttt{\toindex{FtpClose}(FTP~*)}
{Закрывает ранее открытый поток данных.}

\section{Команды для сервера и вспомогательные функции}

\ttt{\toindex{FtpCommand}(FTP~*, char~*command, char~*param, int~ok1, ok2, ok3, ..., okN, EOF)}
{ Посылает команду, составленную из параметров \ts{command} и \ts{param}, и считывает 
ответ сервера, если код ответа не совпадает не с одним значением \ts{ok}, то
знак кода ответа меняется на '-'. В случае если установлен handler обработки 
ошибок вызывает его. 
}

\ttt{\toindex{FtpType}(FTP~*,char~*mode)}
{Устанавливает моду передачи файлов, mode может быть ``A'', ``I'', ``S'',....}

\ttt{\toindex{FtpBinary}(FTP~*)}
{Устанавливает двоичную моду передачи файлов}

\ttt{\toindex{FtpAscii}(FTP~*)}
{Устанавливает текстовую моду передачи файлов}


\ttt{\toindex{FtpMkdir}(FTP~*,char *dirname)}
{Создает директорию на сервере}

\ttt{\toindex{FtpChdir}(FTP~*,char *dirname)}
{Меняет активную директорию на сервере}

\ttt{\toindex{FtpRm}(FTP~*,char *filename)}
{Удаляет файл на сервере}

\ttt{char~*\toindex{FtpPwd}(FTP~*)}
{Возвращает активную директорию на сервере}

\ttt{int \toindex{FtpSize}(FTP~*,char *filename)}
{Возвращает размер файла в байтах, если файл с указанным именем отсутствует,
то возвращается статус ошибки, т.е. значение меньше нуля}

\ttt{\toindex{FtpMove}(FTP~*,char *oldfilename, char *newfilename)}
{Переименовывает на сервере файл \ts{oldfilename} в файл \ts{newfilename}}

\ttt{\toindex{FtpPort}(FTP~*, int~a, int~b, int~c, int~d, int~e, int~f)}
{Команда серверу создать канал для передачи данных. Причем \ts{a.b.c.d} это IP адрес 
клиента а \ts{e*256+f} номер порта.}

\ttt{struct hostent *\toindex{FtpGetHost}(char *hostname)}
{Возвращает указатель на структуру типа hostent.
 Аргумент -- это строка содержащая или имя машины,
или ее IP адрес в строчном виде\footnote{Например: ``dxunk8.oea.ihep.su'' или 
``192.102.229.71''}.}

\section{Подпрограммы передачи сообщений в/из сервера}

\ttt{\toindex{FtpSendMessage}(FTP~*, char~*message)}
{Посылает сообщение серверу}

\ttt{int \toindex{FtpGetMessage}(FTP~*)}
{Принимает сообщение от сервера и возвращает его код}

\ttt{\toindex{FtpMessage}(int Number)}
{Возвращает по коду сообщения его содержимое}

\section{Функции полного сеанса работы}

\ttt{FILE *\toindex{FtpFullOpen}(char *filename,char *mode)}
{ Разбирает строку filename, которая должна быть типа 
\\ \ts{host/user/password:filename} или же типа \ts{filename}, в зависимости от этого 
открывается  файл или на сервере \ts{host} или локальный файл. Параметр mode должен
содержать один или два символа. Первый задает тип открытия файла ``r'',``w'' или
``a''. Второй символ может содержать символ ``b'' что будет задавать двоичную моду передачи}
\ttt{\toindex{FtpFullClose}(FILE *f)}
{Закрытие файла}


\section{Описание примеров и прикладных программ}

\subsection{Программа get}\index{get}

Копирование файла с сервера в локальный файл с таким же именем с использованием функций полного сеанса.


\subsection{Программа fcp}\index{fcp}

Программа fcp демонстрирует простое использование функций полного сеанса работы
(FtpFullOpen и FtpFullClose). Имя файла передаваемого в качестве 
параметра, может описывать и локальный и удаленный файл. Это позволяет
производить передачу как с сервера в локальный файл, так и наоборот,
 а также с сервера на сервер.

\subsection{Программа ftptry}\index{ftptry}

Предназначена для передачи файлов большого размера по сетям которые 
очень часто ``ломаются''. Это прежде всего относится к сетям построенных
на dialup-линиях. 

\ts{ftptry} в основном  предназначен для неитерактивной 
передачи данных, поэтому необходимая информация для выполнения передачи задаeтся в виде опций при запуске программы. 

При запуске \ts{ftptry} без ключей, на экран выводится список всех допустимых 
опций и один пример запуска, поэтому в данном руководстве ключи 
и их назначения описывать не имеет смысла. 
Необходимо только сказать о том, что 
так как некоторые опции необходимо ставить практически всегда, 
то можно предварительно
установить переменную окружения ``FTPTRY''\index{FTPTRY enviroment} 
по аналогии с тем как это делается 
в программе ``less''
\footnote{Например: \% setenv FTPTRY ``-DBb -u anonymous -s 60 -t 15''},
и писать в командной строке только те опции которые редко 
используются или не писать их вообще.


\newpage
\input rus.ind
\newpage
\tableofcontents
\end{document}


OpenPOWER on IntegriCloud