![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобратся со скачкой файлов через прокси(TclientSocket) [D7, WinXP]
BANick © (2005-12-14 11:13:00)Здравствуйте!
мне нужно скачать с определенного урла сначала хтмл текст, понов проаналлизировав его скачать нужные картинки. пробовал через InternetOpenURL но картинки после этого уже были недоступны(для картинок урл генерится случайным образом и при втором InternetOpenURL на нужную картинку, картинка уже заблокирована) т.е. нужно созранять коннект с сервером как это делает браузер - мне посоветовали сокеты, но после SendText выдается ошибка 10060(т.е. ответа не получено) я подозреваю что это из за того что у меня соединение через проксю - подскажите какую нужно передавать строчку
procedure TForm1.SocketWrite(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText(Chtml);
end;
procedure TForm1.SocketRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
FText := FText + Socket.ReceiveText
end;
procedure TForm1.SocketConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
FText := '';
end;
procedure TForm1.SocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Form1.Caption:=':)';
end;
procedure TForm1.SocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
s,a,t:string;
begin
тут должен анализироватся текст и запускатся новый сокет для скачивания картинки
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CS.Open;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CS:=TClientSocket.Create(form1);
CS.Port:=80;
CS.Host:='www.ag.ru';
CS.OnConnecting:=SocketConnecting;
CS.OnDisconnect:=SocketDisconnect;
CS.OnRead:=SocketRead;
CS.OnConnecting:=SocketWrite;
CS.OnConnect:=SocketConnect;
Ghtml:='';
Ghtml:=Ghtml+'GET '+Webpage+' HTTP/1.1'#10#10;
Ghtml:=Ghtml+'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*'#10#10;
Ghtml:=Ghtml+'Accept-Language: ru'#10#10;
Ghtml:=Ghtml+'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'#10#10;
Ghtml:=Ghtml+'Host: '+CS.Host+#10#10;
Ghtml:=Ghtml+'Connection: Keep-Alive'#10#10;
Gimg:='';
Gimg:=Gimg+'GET '+Webpage+' HTTP/1.1'#10#10;
Gimg:=Gimg+'Accept: */*'#10#10;
Gimg:=Gimg+'Referer: http://www.ag.ru'#10#10;
Gimg:=Gimg+'Accept-Language: ru'#10#10;
Gimg:=Gimg+'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)'#10#10;
Gimg:=Gimg+'Host: '+CS.Host+#10#10;
Gimg:=Gimg+'Connection: Keep-Alive'#10#10;
Gimg:=Gimg+'Content-Type: image/jpeg'#10#10;
Chtml:=Ghtml;
end;
BANick (2005-12-14 15:16:00) [1]спасибо!
я действительно решил проблему через InternetOpen и картинки доступны если в InternetOpenUrl поставить флаг INTERNET_FLAG_KEEP_CONNECTION
но столкнулся с тем что невозможно использовать InternetSetFilePointer, причем функция возвращает правильное значение
InternetReadFile(hURL, @Buffer,
50, BufferLen);
InternetSetFilePointer(hURL,-10,nil,FILE_CURRENT,0);
она возвращает 40
InternetReadFile(hURL, @Buffer,
50, BufferLen);
InternetSetFilePointer(hURL,1000,nil,FILE_BEGIN,0);
возвращает 1000
но любые вызовы после этого
InternetReadFile не приводят к считыванию(BufferLen=0)
вопрос у меня такой - можно ли какнить это победить или это зависит исключительно от сервера к которому коннекчусь и нужно смирится и читать подряд с первого байта?
isasa (2005-12-14 12:22:00) [2]Смешались в кучу, кони, люди .....
http (proxy) - IP (socket) - две большие разницы.
Попробуй просто
InternetOpen -> InternetConnect -> HttpOpenRequest -> HttpSendRequest -> HttpQueryInfo -> InternetQueryDataAvailable -> InternetReadFile -> InternetCloseHandle
Сервер, возможно, использует куки (или SessionID, если это IIS+.NET) для идентификации сеанса.