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

Вниз

Работа с сокетом   Найти похожие ветки 

 
pOLyMOrpH ©   (2005-08-19 07:28) [0]

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

код функции:
-----------------------------------------------------------------------------------------------------------------------
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, то все работает на ура.

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


 
XProger ©   (2005-08-19 08:04) [1]

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


 
pOLYmORph ©   (2005-08-19 08:09) [2]

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


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

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


 
XProger ©   (2005-08-21 03:07) [4]

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


 
atruhin ©   (2005-08-21 10:07) [5]

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



Страницы: 1 вся ветка

Текущий архив: 2005.12.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.031 c
2-1131968060
igi
2005-11-14 14:34
2005.12.04
как сделать аналог dup()


14-1132194091
Antonn
2005-11-17 05:21
2005.12.04
С днем студента!


11-1112871733
Fanny
2005-04-07 15:02
2005.12.04
Утечки памяти в проектах KOL/MCK


4-1127991575
Rule
2005-09-29 14:59
2005.12.04
Проблемма при открытии СОМ порта посредством функции CreateFile


1-1131374408
IgorOKey
2005-11-07 17:40
2005.12.04
Indy POP3: как сохранить приатаченный файл с русским именем