WinInet докачка
От: Alex  
Дата: 07.10.04 11:57
Оценка:
Помогите найти сабж. Мне нужна докачка с FTP, я что то не нашёл. Может её вообщенет
Re: WinInet докачка
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 07.10.04 17:24
Оценка:
Здравствуйте, Alex, Вы писали:

A>Помогите найти сабж. Мне нужна докачка с FTP, я что то не нашёл. Может её вообщенет


Есть, просто вы неправильно искали FtpCommand же есть — отправляете команду REST и вперед

З.Ы. Если будет нужно — могу на работе кусочек кода глянуть и запостить... Правда, если время будет...
... << RSDN@Home 1.1.3 stable >>
Re[2]: WinInet докачка
От: AlexEagle Украина http://www.vik.oil
Дата: 28.04.05 07:44
Оценка:
Здравствуйте, Flamer, Вы писали:

A>>Помогите найти сабж. Мне нужна докачка с FTP, я что то не нашёл. Может её вообщенет


F>Есть, просто вы неправильно искали FtpCommand же есть — отправляете команду REST и вперед


F>З.Ы. Если будет нужно — могу на работе кусочек кода глянуть и запостить... Правда, если время будет...


Запость и мне
Re[3]: WinInet докачка
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 28.04.05 12:46
Оценка:
Здравствуйте, AlexEagle, Вы писали:

[]

F>>З.Ы. Если будет нужно — могу на работе кусочек кода глянуть и запостить... Правда, если время будет...


AE>Запость и мне


Вот кусок кода, выдранный наживую из проекта — как раз используется докачка по FTP:

  String command;
   command.sprintf("REST %u", FStream->Position);

   HINTERNET hResponse = NULL;

   InternetSetStatusCallback(FConnectHandle,InternetStatusCallback);

   BOOL Ret = FtpCommand(FConnectHandle,
               FALSE,
               FBinary ? FTP_TRANSFER_TYPE_BINARY : FTP_TRANSFER_TYPE_ASCII,
               command.c_str(),
               (DWORD_PTR) this,
               &hResponse);


   if(!Ret)
    {
    if(FCancelled)
          return SetErrorCode(WINFTP_CANCELLED);
    else
       return SetErrorCode();
    }

    command.sprintf("RETR %s", FRemoteFileName.c_str() );
    Ret = FtpCommand(FConnectHandle,
      TRUE,
      FBinary ? FTP_TRANSFER_TYPE_BINARY : FTP_TRANSFER_TYPE_ASCII,
      command.c_str(),
      (DWORD_PTR) this,
     &hResponse);
... << RSDN@Home 1.1.4 beta 6 rev. 433>>
Re[4]: WinInet докачка
От: AlexEagle Украина http://www.vik.oil
Дата: 04.05.05 17:12
Оценка:
Здравствуйте, Flamer, Вы писали:

F>Вот кусок кода, выдранный наживую из проекта — как раз используется докачка по FTP:


Дело в том, что используемый вами код

::FtpCommand( ..., "REST xxx", ... );
::FtpCommand( ..., "RETR ssssss", ... );


приводит к генерации того же набора команд что и

::FtpCommand( ..., "REST xxx", ... );
::FtpOpenFile( ..., "ssssss", ... );


а именно:

REST xxx
TYPE x
PORT x,x,x,x,x,x
SIZE ssssss
RETR ssssss


Правда во втором случае команда SIZE имеет правильный параметр, а не кракозябры

Это можно увидеть, выполнив докачку с Ftp-сервера Pablo van der Meer-а

Как бы то ни было, такой "рабочий" код никак не приводит к 100%-правильной докачке, для которой последовательность команд должна быть такой:

TYPE x
PORT x,x,x,x,x,x
REST xxx
RETR ssssss


если конечно я правильно понял некоего Aler-a
Автор: aler
Дата: 11.09.03




Безусловно, приведенный вами код работает на большинстве FTP-серверов, но попадаются и такие, которые будут отдавать файл "с нуля", с одним из которых я и столкнулся



Возвращаясь к вопросу — есть ли способ заставить wininet передать указанную последовательность команд... а то тот FtpCommand как оказалось не совсем передача команды.
Re[5]: WinInet докачка
От: jugard  
Дата: 15.09.07 18:14
Оценка:
Обсуждение вроде бы затихло 2 года назад.. Но оно мне очень помогло, поэтому хочу добавить..


.
.
.

FtpCommand(hConnect, 0, 0, TEXT("SIZE file.txt"), 0, 0);
InternetGetLastResponseInfo(&dw, RespBuf, &dwCount);
//RespBuf указывает на "213 15566784"
TCHAR *endresp(_tcsstr(RespBuf, TEXT("\r\n")));
FileSize = _tcstoi64(RespBuf+4, &endresp, 10);

HINTERNET hFile;

FtpCommand(hConnect, true, FTP_TRANSFER_TYPE_BINARY, TEXT("TYPE I\r\nPASV\r\nREST 100\r\nRETR\r\n"), 0, &hFile);

while(InternetReadFile(hFile, DataBuf, DataBufSize, &dwCountFF))
{
.
.
.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.