Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.055 c
1-1108463354
Толян
2005-02-15 13:29
2005.02.27
Клавиши


1-1107968525
alexa
2005-02-09 20:02
2005.02.27
Цвет в Panel


4-1105004637
sergeii
2005-01-06 12:43
2005.02.27
Com Port


14-1107883250
Jeer
2005-02-08 20:20
2005.02.27
Слушай, ТЫ - Максим !


1-1108021065
KingDog
2005-02-10 10:37
2005.02.27
вот знаете что то при n = 31 не считает