Форум: "Сети";
Текущий архив: 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.134 c