Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с сокетом [D6, WinME, WinXP]


pOLyMOrpH ©   (2005-08-19 07:28:00) 

добрейшего времени суток, уважаемые мастера.
у меня такая проблема:

код функции:
-----------------------------------------------------------------------------------------------------------------------
function Recv_Send_Data(params:string):string;
var
 bufer : array [0..1023] of Char; {буфер для приема ответа с сервака}
 sock  : integer;       {адрес сокета}
 error : integer;       {обработка ошибок}
 wData : WSADATA;
 addr  : sockaddr_in;
 phe   : PHostEnt;
begin
 //Инициализация сокета
 Result := '';
 WSAStartup($101, wData);

 phe := gethostbyname(PChar(string(host)));

 if phe = nil then
   begin
     WSACleanup;
     Exit;
   end;

 sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

 if sock = INVALID_SOCKET then
   begin
     WSACleanup;
     Exit;
   end;

 addr.sin_family := AF_INET;
 addr.sin_port   := htons(80);
 addr.sin_addr   := PInAddr(phe.h_addr_list^)^;

 error := connect(sock, addr, sizeof(addr));
 if error = SOCKET_ERROR then
   begin
     closesocket(sock);
     WSACleanup;
     Exit;
   end;

 // отправляем
 send(sock, params[1], Length(params), 0);

 // принимаем
 ZeroMemory(@bufer, 1024);
 error := recv(sock, bufer, 1024, 0);
 while error > 0 do
   begin
     Result := Result + Copy(bufer, 0, error);
     error  := recv(sock, bufer, 1024, 0);      
   end;

 // Закрываем сокет
 closesocket(sock);
 WSACleanup;
end;
------------------------------

вызов:
----------------------------------------------------------------------------------------
host:='host.com';

request := 'GET http://' + host +  '/blabla?bla...' +  ' HTTP/1.0'#13#10#13#10;

// к примеру
memo1.Lines.Add(Recv_Send_Data(request));
---------------------------------------------------------------------------------------

собственно вопрос:
пытаюсь слить хтмл исходник произвольной страницы с произвольного сервера.
почему в некоторых случаях я, задав определенный хост, получаю ответ вообще с другого сервера?

конкретный пример:
задаю хост - amigos.com
ответ приходит с friendfinder.com (т.е. совершенно другая страница).

причем если в кач-ве хоста указывать например yandex.ru, то все работает на ура.

оч. интересно как с этим бороться?
жду ваших мыслей и предложений.


atruhin   (2005-08-21 10:07:00) [1]

1. Не правильное формирование запроса. Полный URI используется только при работе через прокси, при обращении к хосты нужно указывать только ресурс и имя хоста в параметре host.
2. Данная процедура возможно сработает только для очень "тепличных условий". Так как send это функция о чем неоднократно говорилось, в recv если ты получил все пересланные данные - это не значит что сервер переслал все, т.е. сервер переслал часть страницы, может сделать паузу, потом переслать остаток, а ты уже закрыл сокет.


XProger   (2005-08-21 03:07:00) [2]

Запусти снифер и посмотри, как к нему обращается IE и твоя программа для сравнения :)


pOLyMOrpH   (2005-08-19 10:07:00) [3]

а может я request неправильно составляю? например в IE открывается требуемая страница.


pOLYmORph   (2005-08-19 08:09:00) [4]

а как это можно реализовать?
ведь остальные браузеры "работают нормально", т.е. получают задданную им страницу...


XProger   (2005-08-19 08:04:00) [5]

Редиректом это зовётся ;)


Наверх

Титульная страница Поиск, карта сайта Написать письмо