Консультация № 57799
05.10.2006, 13:26
0.00 руб.
0 6 2
Здравствуйте, уважаемые мастера.
Подскажите, пожалуйста(поэтапно) как принимать и передавать файлы с помощью сервера FTP.
Например, есть два компьтера в разных точках города (Windows XP 2pack) в своей локальной сети с модемом ADSL.
Я понимаю это так: На одном компе должен стоять FTP сервер (программа есть, скачано с Ineta), в нем я должен прописать пользователя и пароль, также папку куда будут сбрасываться и забираться файлы и серверное приложение. На втором клиенсткое приложение. Звонилку в Инет я написал.
А дальше темный лес:
- Что для сервера FTP будет адресом IP, адрес IP копма в локальной сети ?
- Как по компоненту NMFTP(у меня Delphi5) ищется серер с клиенского приложения ?
- Задействовать ли компоненты ServerSocet и CliehtSocet ?
Или я не так все это понимаю? Вообщем каша в голове. Разъясните, пожалуйста.
С уважением, kraw.

Обсуждение

давно
Мастер-Эксперт
425
4118
05.10.2006, 13:48
общий
это ответ
Здравствуйте, Kraw!
1) Нет. Адресом будет интернетовский адрес того файрвола, через который Ваш компьютер подключается к серверу. Если компьютер подключается напрямую (через модем), то ему выделяется провайдером динамический адрес, который действует только на текущий сеанс связи.
2) Сервер никаким образом не ищется компонентом. Вы ему четко прописываете либо имя сервера (например ftp.freepascal.org) либо его IP (192.224.143.26).
3) Задействованы, но не Вами напрямую, а в скрытой от Вас форме. Вам на это внимание обращать не нужно.
По работе с компонентом NMFTP прочитайте статью здесь:
http://delphiworld.narod.ru/base/tnmftp.html
Там написано все очень хорошо и понятно.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
05.10.2006, 17:07
общий
это ответ
Здравствуйте, Kraw!
В дополнение к ответу sir henry вот Вам небольшой примерчик.
Попробуйте вызвать FtpDownloadFile с такими параметрами:
srtHost:= ‘ftp.rusfaq.ru‘;
strUser:= ‘anonymous‘;
strPwd:= ‘rusfaq.ru‘;
Port:= 21;
ftpDir:= ‘/‘;
ftpFile:= ‘upload.txt‘;
TargetFile:= ‘C:\upload.txt‘;
На форме должны быть Label и ProgressBar.
Я лично использую компонент iPro. Не помню откуда качал. Если нужен, пишите.

Приложение:
uses WinInet, ComCtrls; function FmtFileSize(Size: Integer): string; begin if Size >= $F4240 then Result := Format(‘%.2f‘, [Size / $F4240]) + ‘ Mb‘ else if Size < 1000 then Result := IntToStr(Size) + ‘ bytes‘ else Result := Format(‘%.2f‘, [Size / 1000]) + ‘ Kb‘; end;function FtpDownloadFile(strHost, strUser, strPwd: string; Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean; const READ_BUFFERSIZE = 4096; // or 256, 512, ... var hNet, hFTP, hFile: HINTERNET; buffer: array[0..READ_BUFFERSIZE - 1] of Char; bufsize, dwBytesRead, fileSize: DWORD; sRec: TWin32FindData; strStatus: string; LocalFile: file; bSuccess: Boolean; ProgName: string; begin Result := False; ProgName:= Application.ExeName; { Open an internet session } hNet := InternetOpen(PChar(ProgName), // Agent INTERNET_OPEN_TYPE_PRECONFIG, // AccessType nil, // ProxyName nil, // ProxyBypass 0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE { Agent contains the name of the application or entity calling the Internet functions } { See if connection handle is valid } if hNet = nil then begin ShowMessage(‘Unable to get access to WinInet.Dll‘); Exit; end; { Connect to the FTP Server } hFTP := InternetConnect(hNet, // Handle from InternetOpen PChar(strHost), // FTP server port, // (INTERNET_DEFAULT_FTP_PORT), PChar(StrUser), // username PChar(strPwd), // password INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher? 0, // flag: 0 or INTERNET_FLAG_PASSIVE 0);// User defined number for callback if hFTP = nil then begin InternetCloseHandle(hNet); ShowMessage(Format(‘Host "%s" is not available‘,[strHost])); Exit; end; { Change directory } bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir)); if not bSuccess then begin InternetCloseHandle(hFTP); InternetCloseHandle(hNet); ShowMessage(Format(‘Cannot set directory to %s.‘,[ftpDir])); Exit; end; { Read size of file } if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then begin fileSize := sRec.nFileSizeLow; // fileLastWritetime := sRec.lastWriteTime end else begin InternetCloseHandle(hFTP); InternetCloseHandle(hNet); ShowMessage(Format(‘Cannot find file ‘,[ftpFile])); Exit; end; { Open the file } hFile := FtpOpenFile(hFTP, // Handle to the ftp session PChar(ftpFile), // filename GENERIC_READ, // dwAccess FTP_TRANSFER_TYPE_BINARY, // dwFlags 0); // This is the context used for callbacks. if hFile = nil then begin InternetCloseHandle(hFTP); InternetCloseHandle(hNet); Exit; end; { Create a new local file } AssignFile(LocalFile, TargetFile); {$i-} Rewrite(LocalFile, 1); {$i+} if IOResult <> 0 then begin InternetCloseHandle(hFile); InternetCloseHandle(hFTP); InternetCloseHandle(hNet); Exit; end; dwBytesRead := 0; bufsize := READ_BUFFERSIZE; while (bufsize > 0) do begin Application.ProcessMessages; if not InternetReadFile(hFile, @buffer, // address of a buffer that receives the data READ_BUFFERSIZE, // number of bytes to read from the file bufsize) then Break; // receives the actual number of bytes read if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then BlockWrite(LocalFile, buffer, bufsize); dwBytesRead := dwBytesRead + bufsize; { Show Progress } ProgressBar.Position := Round(dwBytesRead * 100 / fileSize); Form1.Label1.Caption := Format(‘%s of %s / %d %%‘,[FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,ProgressBar.Position]); end; CloseFile(LocalFile); InternetCloseHandle(hFile); InternetCloseHandle(hFTP); InternetCloseHandle(hNet); Result := True; end;
Неизвестный
05.10.2006, 17:20
общий
Sir_henry, благодарю.
Неизвестный
05.10.2006, 17:36
общий
Вадим Иванович, благодарю.Не сочтите назойливым, еще вопрос: Установил на свой комп FTP сервер.Подключился к Inetу и запустил FTP сервер.После этого сразу же выдалось сообщение:Local host: IP-адрес. Данный IP-адрес и есть адресFTP сервера ?
давно
Мастер-Эксперт
425
4118
06.10.2006, 10:20
общий
Отвечу за Вадима Ивановича, Вы не возражаете? :)Если IP адрес имеет вид 127.0 и так далее, то этот адрес используется исключительно для внутренних нужд самого компьютера.Если IP адрес имеет вид 192.168. и так далее или 10. и так далее, то такие адреса присваиваются только внутри корпоративных сетей, это так сказать внутренние адреса. В интернете они сразу же обрубаются на ближайшем шлюзе и в инете никоим образом не доступны.Все остальные IP могут быть интернетовские.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
06.10.2006, 10:38
общий
Спасибо, sir_henry. Извините, что не ставлю оценки.Через Ms Outlook не ставятся, а на форуме не могу найти, где ставить.С уважением, kraw.
Форма ответа