![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с сокетом [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]Редиректом это зовётся ;)