Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

InternetSetOption   Найти похожие ветки 

 
Архитектор   (2004-12-14 11:18) [0]

Почему в этом коде не срабатывает timeout?
Помогите, пожалуйста.

var
 hNet,hFTP:Pointer;
 t:integer;
 dt:TDateTime;
begin
 hNet:=InternetOpen("Program_Name",
                    INTERNET_OPEN_TYPE_PRECONFIG,
                    nil,nil,0);
 t:=1000; // установил timeout = 1 секунду
 InternetSetOption(hNet,INTERNET_OPTION_CONNECT_TIMEOUT,
                   @t,sizeof(t));
 dt:=Time;
 hFTP:=InternetConnect(hNet,PChar(ftpHost),ftpPort,PChar(ftpUser),
                       PChar(ftpPass),INTERNET_SERVICE_FTP,0,0);
 showmessage(inttostr(MilliSecondsBetween(Time,dt)));
 // выводит больше 3 секунд (???)

 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);
end;


 
Rouse_ ©   (2004-12-14 12:46) [1]

А что InternetQueryOption говорит?


 
Архитектор   (2004-12-14 14:09) [2]

var
 s1,s2:DWORD; er:integer;
begin
 InternetQueryOption(hNet,INTERNET_OPTION_CONNECT_TIMEOUT,@s1,s2) // возвращает false
 er:=GetLastError;
 if er=ERROR_INSUFFICIENT_BUFFER then "возникает эта ошибка";
end;

Ламер, я - ламер, как правильно сделать вызов InternetQueryOption?


 
Архитектор   (2004-12-14 14:09) [3]

Удалено модератором
Примечание: Дубль...


 
Rouse_ ©   (2004-12-14 14:19) [4]

var
hNet,hFTP:Pointer;
t: DWORD;
TVerify, Len: DWORD;
dt:TDateTime;
begin
 hNet:=InternetOpen("Program_Name",
                   INTERNET_OPEN_TYPE_PRECONFIG,
                   nil,nil,0);
 t:=1000;
 InternetSetOption(hNet,INTERNET_OPTION_CONNECT_TIMEOUT,
                  @t,sizeof(t));
 Len := sizeof(dword);
 InternetQueryOption(hNet, INTERNET_OPTION_CONNECT_TIMEOUT, @TVerify, Len);
 ShowMessage(IntToStr(TVerify));


 
Архитектор   (2004-12-14 15:15) [5]

Я эту строку забыл:
Len := sizeof(dword);

Только вот ставлю таймаут в 1 сек., теперь вот еще и проверяю, действительно ли выставлено такое значение (т.е. 1000 миллисекунд). InternetQueryOption сообщает, что да, именно такое значение.
И все равно не работает таймаут.
Я, наверное, не так эксперимент ставлю.
Надо поэкспериментировать.
Надеюсь, это ошибка не в моем ДНК :-)
Rouse_ - тебе отдельное спасибо за невероятное терпение.


 
Архитектор   (2004-12-14 15:15) [6]

Удалено модератором
Примечание: Дубль...


 
Rouse_ ©   (2004-12-14 15:29) [7]

Честно говоря лень писать тестовый код, выложи свой я посмотрю...


 
Архитектор   (2004-12-15 09:27) [8]

Вот полный код. Вопрос все тот же: "Почему не срабатывают timeout-ы?"

procedure TForm1.Button1Click(Sender: TObject);
var
 ftpHost, ftpUser, ftpPass, ftpFile,Error,str:string;
 ftpPort:integer;
 passive:boolean;
 ASCII:boolean;
 timeout:integer;
begin
 ftpHost:="10.106.10.250";
 ftpPort:=21;
 ftpUser:="anonymous";
 ftpPass:="pass@pass.ru";
 ftpFile:="INCOMING/K0343/!LOAD/5100/test.txt";
 str:="Добавляемая строка "+timetostr(time);
 ASCII:=true;
 passive:=true;
 timeout:=1000;
 if FtpAddStrToFile(ftpHost,ftpPort,ftpUser,ftpPass,ftpFile,str,ASCII,passive,timeout,Error)
   then showmessage("Готово")
   else showmessage(Error);
end;

function AnsiToOemStr(const AnsiStr: string): string;
begin
 SetLength(Result, Length(AnsiStr));
 if Length(Result) > 0 then
   AnsiToOem(PChar(AnsiStr), PChar(Result));
end;

// Добавление строки в файл, который лежит на FTP
function FtpAddStrToFile(ftpHost:string; ftpPort:integer; ftpUser,ftpPass,ftpFile,
                        str:string; ASCII:boolean; passive:boolean; timeout:integer; var strError:string):boolean;
var
 hNet,hFTP:Pointer;
 LocalFile:string;
 bSuccess:Boolean;
 szPath,szFile : array[0..MAX_PATH-1] of Char;
 SL:TStrings;
 sRec: TWin32FindData;
begin
 strError:="";
 result:=false;

 hNet:=InternetOpen("Program_Name",INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
 if hNet = nil then
 begin
   strError:="Unable to get access to WinInet.Dll";
   Exit;
 end;

 if (not InternetSetOption(hNet,INTERNET_OPTION_CONNECT_TIMEOUT,@timeout,sizeof(timeout))) or
    (not InternetSetOption(hNet,INTERNET_OPTION_RECEIVE_TIMEOUT,@timeout,sizeof(timeout))) or
    (not InternetSetOption(hNet,INTERNET_OPTION_SEND_TIMEOUT,@timeout,sizeof(timeout)))  then
 begin
   strError:="Cannot set timeout";
   Exit;
 end;

 if passive
 then
   hFTP:=InternetConnect(hNet,PChar(ftpHost),ftpPort,PChar(ftpUser),PChar(ftpPass),
                         INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0)
 else
   hFTP:=InternetConnect(hNet,PChar(ftpHost),ftpPort,PChar(ftpUser),PChar(ftpPass),
                         INTERNET_SERVICE_FTP,0,0);

 if hFTP = nil then
 begin
   InternetCloseHandle(hNet);
   strError:=Format("Host "%s" is not available",[ftpHost]);
   Exit;
 end;

 // Создание файла во временной папке. Имя файла сохраняем в переменной LocalFile
 if (GetTempPath(MAX_PATH,szPath)=0) or (GetTempFileName(szPath,"kxp",0,szFile)=0) then
 begin
   InternetCloseHandle(hFTP);
   InternetCloseHandle(hNet);
   strError:="Cannot GetTempPath or GetTempFileName";
   Exit;
 end;
 LocalFile:=StrPas(szFile);

 if FtpFindFirstFile(hFtp,PChar(ftpFile),sRec,0,0) <> nil then
 begin
   bSuccess:=FtpGetFile(hFtp,Pchar(ftpFile),Pchar(LocalFile),false,FILE_ATTRIBUTE_TEMPORARY,
                        FTP_TRANSFER_TYPE_BINARY or INTERNET_FLAG_RELOAD,0);
   if not bSuccess then
   begin
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     strError:="Cannot get the file from the FTP server.";
     if not DeleteFile(LocalFile) then strError:=strError+" Cannot Delete LocalFile.";
     Exit;
   end;

   bSuccess:=FtpDeleteFile(hFtp,Pchar(ftpFile));
   if not bSuccess then
   begin
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     strError:="Cannot Delete ftpFile.";
     if not DeleteFile(LocalFile) then strError:=strError+" Cannot Delete LocalFile.";
     Exit;
   end;
 end;

 // Добавление строки в файл
 SL:=TStringList.Create;
 try
   SL.LoadFromFile(LocalFile);
   if ASCII then str:=AnsiToOemStr(str);
   SL.Add(str);
   SL.SaveToFile(LocalFile);
 finally
   SL.Free;
 end;

 bSuccess:=FtpPutFile(hFtp,Pchar(LocalFile),Pchar(ftpFile),0,0);
 if not bSuccess then
 begin
   InternetCloseHandle(hFTP);
   InternetCloseHandle(hNet);
   strError:="Cannot store the file on the FTP server.";
   if not DeleteFile(LocalFile) then strError:=strError+" Cannot Delete LocalFile.";
   Exit;
 end;

 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);

 if not DeleteFile(LocalFile) then
 begin
   strError:="Cannot Delete LocalFile.";
   exit;
 end;

 result:=true;
end;


 
Архитектор   (2004-12-15 09:27) [9]

Вот полный код. Вопрос все тот же: "Почему не срабатывают timeout-ы?"

procedure TForm1.Button1Click(Sender: TObject);
var
 ftpHost, ftpUser, ftpPass, ftpFile,Error,str:string;
 ftpPort:integer;
 passive:boolean;
 ASCII:boolean;
 timeout:integer;
begin
 ftpHost:="10.106.10.250";
 ftpPort:=21;
 ftpUser:="anonymous";
 ftpPass:="pass@pass.ru";
 ftpFile:="INCOMING/K0343/!LOAD/5100/test.txt";
 str:="Добавляемая строка "+timetostr(time);
 ASCII:=true;
 passive:=true;
 timeout:=1000;
 if FtpAddStrToFile(ftpHost,ftpPort,ftpUser,ftpPass,ftpFile,str,ASCII,passive,timeout,Error)
   then showmessage("Готово")
   else showmessage(Error);
end;

function AnsiToOemStr(const AnsiStr: string): string;
begin
 SetLength(Result, Length(AnsiStr));
 if Length(Result) > 0 then
   AnsiToOem(PChar(AnsiStr), PChar(Result));
end;

// Добавление строки в файл, который лежит на FTP
function FtpAddStrToFile(ftpHost:string; ftpPort:integer; ftpUser,ftpPass,ftpFile,
                        str:string; ASCII:boolean; passive:boolean; timeout:integer; var strError:string):boolean;
var
 hNet,hFTP:Pointer;
 LocalFile:string;
 bSuccess:Boolean;
 szPath,szFile : array[0..MAX_PATH-1] of Char;
 SL:TStrings;
 sRec: TWin32FindData;
begin
 strError:="";
 result:=false;

 hNet:=InternetOpen("Program_Name",INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
 if hNet = nil then
 begin
   strError:="Unable to get access to WinInet.Dll";
   Exit;
 end;

 if (not InternetSetOption(hNet,INTERNET_OPTION_CONNECT_TIMEOUT,@timeout,sizeof(timeout))) or
    (not InternetSetOption(hNet,INTERNET_OPTION_RECEIVE_TIMEOUT,@timeout,sizeof(timeout))) or
    (not InternetSetOption(hNet,INTERNET_OPTION_SEND_TIMEOUT,@timeout,sizeof(timeout)))  then
 begin
   strError:="Cannot set timeout";
   Exit;
 end;

 if passive
 then
   hFTP:=InternetConnect(hNet,PChar(ftpHost),ftpPort,PChar(ftpUser),PChar(ftpPass),
                         INTERNET_SERVICE_FTP,INTERNET_FLAG_PASSIVE,0)
 else
   hFTP:=InternetConnect(hNet,PChar(ftpHost),ftpPort,PChar(ftpUser),PChar(ftpPass),
                         INTERNET_SERVICE_FTP,0,0);

 if hFTP = nil then
 begin
   InternetCloseHandle(hNet);
   strError:=Format("Host "%s" is not available",[ftpHost]);
   Exit;
 end;

 // Создание файла во временной папке. Имя файла сохраняем в переменной LocalFile
 if (GetTempPath(MAX_PATH,szPath)=0) or (GetTempFileName(szPath,"kxp",0,szFile)=0) then
 begin
   InternetCloseHandle(hFTP);
   InternetCloseHandle(hNet);
   strError:="Cannot GetTempPath or GetTempFileName";
   Exit;
 end;
 LocalFile:=StrPas(szFile);

 if FtpFindFirstFile(hFtp,PChar(ftpFile),sRec,0,0) <> nil then
 begin
   bSuccess:=FtpGetFile(hFtp,Pchar(ftpFile),Pchar(LocalFile),false,FILE_ATTRIBUTE_TEMPORARY,
                        FTP_TRANSFER_TYPE_BINARY or INTERNET_FLAG_RELOAD,0);
   if not bSuccess then
   begin
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     strError:="Cannot get the file from the FTP server.";
     if not DeleteFile(LocalFile) then strError:=strError+" Cannot Delete LocalFile.";
     Exit;
   end;

   bSuccess:=FtpDeleteFile(hFtp,Pchar(ftpFile));
   if not bSuccess then
   begin
     InternetCloseHandle(hFTP);
     InternetCloseHandle(hNet);
     strError:="Cannot Delete ftpFile.";
     if not DeleteFile(LocalFile) then strError:=strError+" Cannot Delete LocalFile.";
     Exit;
   end;
 end;

 // Добавление строки в файл
 SL:=TStringList.Create;
 try
   SL.LoadFromFile(LocalFile);
   if ASCII then str:=AnsiToOemStr(str);
   SL.Add(str);
   SL.SaveToFile(LocalFile);
 finally
   SL.Free;
 end;

 bSuccess:=FtpPutFile(hFtp,Pchar(LocalFile),Pchar(ftpFile),0,0);
 if not bSuccess then
 begin
   InternetCloseHandle(hFTP);
   InternetCloseHandle(hNet);
   strError:="Cannot store the file on the FTP server.";
   if not DeleteFile(LocalFile) then strError:=strError+" Cannot Delete LocalFile.";
   Exit;
 end;

 InternetCloseHandle(hFTP);
 InternetCloseHandle(hNet);

 if not DeleteFile(LocalFile) then
 begin
   strError:="Cannot Delete LocalFile.";
   exit;
 end;

 result:=true;
end;


 
Архитектор   (2004-12-15 09:29) [10]

Вопрос к модераторам: "Почему мои сообщения дублируются?"


 
Архитектор   (2004-12-15 09:29) [11]

Вопрос к модераторам: "Почему мои сообщения дублируются?"


 
Архитектор   (2004-12-18 14:09) [12]

Неужели никто не знает?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.05 c
1-1107956553
Джинн
2005-02-09 16:42
2005.02.27
Interface + TDataSet. Проблемы совместимости.


14-1107943456
АлексС
2005-02-09 13:04
2005.02.27
Контрольная сумма


3-1106912783
LEONardo
2005-01-28 14:46
2005.02.27
Из только чтение в полный доступ


14-1107932513
Vlad Oshin
2005-02-09 10:01
2005.02.27
а ля Задорнов. Просто...потому что достало...


14-1107361575
SPeller
2005-02-02 19:26
2005.02.27
Силикон





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский