Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2010, 21:03   #1
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию Скачивание файла winsock

Здравствуйте помогите пожалуйста реализовать скачивание файла через winsock. Взял пример отсюда _http://www.delphimaster.ru/cgi-bin/forum.pl?id=1205426277&n=4&p=1
но он неработоспособный
Вот как я переделал использовая свой первый сайт на народе

Код:

 F:File;
 s: TSocket;
 data: TWSAData;
 Addr: TSockAddr;
 Recived: Integer;
 Buff: array [0..1023] of Char;
 HTTPRequest,HTTPResponse,Name1,IP,Path: string;

begin
AssignFile(f, 'file.exe');
      Rewrite(f,1);
 IP:= '213.180.199.9';
 name1:='likeall.narod.ru';
 Path:= '/Install/ArtMoney/artmoney722rus.exe';
 WSAStartup($101, data);
 s:=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
 Addr.sin_family:=AF_Inet;
 Addr.sin_port:=htons(80);
 Addr.sin_addr.S_addr:=inet_addr(PAnsiChar(IP));
 if (connect(s,Addr,SizeOf(TSockAddr)) <> SOCKET_ERROR) then
   begin
     HTTPRequest:='GET '+Path+' HTTP/1.1' +#13#10+ 'Host: '+Name1+#13#10+'Connection: Close'+#13#10#13#10;
     send(s, HTTPRequest[1], length(HTTPRequest),0);
     HTTPResponse:= '';
     Recived:= 1;
     while Recived <> 0 do
       begin
         Recived:= recv(s, Buff, Length(Buff), 0);
         BlockWrite(f, Buff, Length(Buff));
          HTTPResponse:=copy(HTTPResponse,Recived+4,MaxInt);
       end;
     closesocket(s);
     CloseFile(F);
   end;
 WSACleanup();
    end;
он вроде полностью скачивает файл но в самом начале файла присутвует

Цитата:
HTTP/1.1 200 OK
Date: Wed, 26 May 2010 17:00:55 GMT
Server: ZX_Spectrum/1997 (Sinclair_BASIC)
Set-Cookie: nuid=2389981601274893255; path=/; expires=Sat, 23-May-20 17:00:55 GMT; domain=.narod.ru
Last-Modified: Sun, 22 Jul 2007 09:56:16 GMT
ETag: "8df905-be000-46a329c0"
Accept-Ranges: bytes
Content-Length: 778240
Connection: close
Content-Type: application/octet-stream
помогите исправить данный код
Horus92 вне форума Ответить с цитированием
Старый 26.05.2010, 21:16   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну так правильно, отсеивать заголовки ответа сервера кто будет?
(а то вы их тоже сохраняете)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 26.05.2010 в 21:20.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.05.2010, 21:30   #3
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию

а как мне отсеить только заголовки их же может быть больше или меньше как отличить заголовки от файла??
Horus92 вне форума Ответить с цитированием
Старый 26.05.2010, 21:35   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

насколько я помню, перед телом сообщения идет двойной перевод строки

Цитата:
Тело сообщения (англ. Message Body) — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.05.2010, 22:08   #5
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию

а как можно отсеить? я попытался через delete но оказалось что эта команда не работает с массивом чаров.
Horus92 вне форума Ответить с цитированием
Старый 26.05.2010, 22:22   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

она не работает со статическим массивом.
я точно не знаю,(пишу библиотеку классов, но до этого не дошел)
посмотрите как в Indy сделан IOHandler(конкретно метод ReadLN) думаю поможет
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.05.2010, 23:10   #7
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию

Я сделал по другому вслучае нахождения перевода строки я посимвольно записывал в файл
Код:
begin
AssignFile(f, 'file.exe');
      Rewrite(f,1);
 IP:= '213.180.199.9';
 name1:='likeall.narod.ru';
 Path:= '/Install/ArtMoney/artmoney722rus.exe';
 WSAStartup($101, data);
 s:=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
 Addr.sin_family:=AF_Inet;
 Addr.sin_port:=htons(80);
 Addr.sin_addr.S_addr:=inet_addr(PAnsiChar(IP));
 if (connect(s,Addr,SizeOf(TSockAddr)) <> SOCKET_ERROR) then
   begin
     HTTPRequest:='GET '+Path+' HTTP/1.1' +#13#10+ 'Host: '+Name1+#13#10+'Connection: Close'+#13#10#13#10;
     send(s, HTTPRequest[1], length(HTTPRequest),0);
     HTTPResponse:= '';
     Recived:= 1;
     while Recived <> 0 do
       begin
         Recived:= recv(s, Buff, Length(Buff), 0);
         if pos(#13#10#13#10,buff)>0 then
         for i:=pos(#13#10#13#10,buff)+3 to 1023 do
          BlockWrite(f, Buff[i],1)
          else
         BlockWrite(f, Buff, Length(Buff));
       end;
     closesocket(s);
     CloseFile(F);
   end;
 WSACleanup();
    end;
заголовки http убрались но все же файл записывается неккоректно и он неработоспособен. не можете подсказать почему так?
Horus92 вне форума Ответить с цитированием
Старый 26.05.2010, 23:42   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас точно лишнего ничего не записывается в файл?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.05.2010, 08:25   #9
Horus92
Форумчанин
 
Аватар для Horus92
 
Регистрация: 04.05.2009
Сообщений: 147
По умолчанию

Cодержимое оригинального и скачаного через winsock отличается вроде внизу много мусора добавлено и все равно файл не работает
Может у меня запрос неправильно сформирован или запись неправильно происходит.
Причина в получении. А вот как её выявить.
Вот модернизировал код на отрезание заголовков и массив теперь не чар а байт но все равно не работает не могу понять почесу
Код:
procedure TNewThread.Execute;
var FileOnNet, LocalFileName: string; b:real; i:integer;
begin
AssignFile(f, 'file.exe');
      Rewrite(f,1);
 IP:= '213.180.199.9';
 name1:='likeall.narod.ru';
 Path:= '/Install/ArtMoney/artmoney722rus.exe';
 WSAStartup($101, data);
 s:=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
 Addr.sin_family:=AF_Inet;
 Addr.sin_port:=htons(80);
 Addr.sin_addr.S_addr:=inet_addr(PAnsiChar(IP));
 if (connect(s,Addr,SizeOf(TSockAddr)) <> SOCKET_ERROR) then
   begin
     HTTPRequest:='GET '+Path+' HTTP/1.1' +#13#10+ 'Host: '+Name1+#13#10+'Connection: Close'+#13#10#13#10;
    send(s, HTTPRequest[1], length(HTTPRequest),0);
     HTTPResponse:= '';
     Recived:= 1;
     while Recived <> 0 do
       begin
          Recived:= recv(s, Buff, Length(Buff), 0);
if bool then
begin
for i:=0 to 1023 do
if (buff[i]=13) and  (buff[i+1]=10)  and  (buff[i+2]=13)
then break;
i:=i+4;
for i:=i to 1023 do
BlockWrite(f, Buff[i],1);
bool:=false;
end else
         BlockWrite(f, Buff, Length(Buff));
       end;
     closesocket(s);
     CloseFile(F);
   end;
 WSACleanup();
    end;

Последний раз редактировалось Horus92; 27.05.2010 в 20:08.
Horus92 вне форума Ответить с цитированием
Старый 29.05.2010, 10:24   #10
xden83
 
Регистрация: 03.02.2010
Сообщений: 5
По умолчанию

Horus92

Если разобрался скажи в чем ошибка была?
xden83 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачивание файла из интернета по ссылке smith45 Microsoft Office Excel 24 24.01.2012 13:15
Частичное скачивание файла Usov Работа с сетью в Delphi 1 19.10.2009 21:45
Скачивание файла Lemo Помощь студентам 16 28.07.2009 22:54
Скачивание случайного файла с фтп snooppy Работа с сетью в Delphi 8 16.10.2008 11:36
Скачивание файла с прогрессом CoDeR Работа с сетью в Delphi 2 22.10.2007 09:10