![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
HTTP запрос средствами WinSock [D7, Win2k, WinXP]
-=Germe$=- © (2007-05-16 07:47:00)Как сделать HTTP запрос(GET) средствами WinSock
-=Germe$=- (2007-05-24 09:56:00) [1]Ошибка вот в этой строчке GET:=Format('GET %s HTTP/1.0'#13#10+'User-Agent: %s'#13#10#13#10, [' http://localhost/test.php?variable='+str,'incompatible']);
-=Germe$=- (2007-05-24 09:34:00) [2]Спасибо большое.. Оно работает.
Сергей М. (2007-05-24 09:29:00) [3]
> проверил - не работат
А у меня работает.
procedure TForm1.Button1Click(Sender: TObject);
var
Sock: TSocket;
Data: TWSAData;
Adr: sockaddr_in;
Get, Response: String;
BytesRead: Integer;
begin
WSAStartup($101,Data);
Adr.sin_family:=AF_INET;
Adr.sin_addr.S_addr:=inet_addr('213.234.193.253'); //www.delphimaster.ru
Adr.sin_port:=htons(80);
Sock:=Socket(AF_INET, SOCK_STREAM, 0);
if Sock=INVALID_SOCKET then Exit;
if connect(Sock,Adr,sizeof(Adr))=0 then begin
GET:=Format('GET %s HTTP/1.0'#13#10+'User-Agent: %s'#13#10#13#10, ['/cgi-bin/forum.pl?id=1179287240&n=4', 'compatible']);
if Send(Sock, PChar(Get)^, Length(Get), 0) = SOCKET_ERROR then
ShowMessage('Send error: ' + IntToStr(WSAGetLastError))
else begin
SetLength(Response, 65536);
BytesRead := Recv(Sock, PChar(Response)^, 65536, 0);
case BytesRead of
-1: ShowMessage('Recv error: ' + IntToStr(WSAGetLastError));
0: ShowMessage('Connection closed by peer');
else
Response[BytesRead] := #0;
ShowMessage(Response);
end;
end;
end;
CloseSocket(Sock);
WSACleanup;
end;
Что я неправильно делаю ?
-=Germe$=- (2007-05-24 05:36:00) [4]Сейчас проверил - не работат....
-=Germe$=- (2007-05-23 12:33:00) [5]Спасибо большое
Сергей М. (2007-05-23 12:30:00) [6]если str - это String, то хотя бы так:
Send(Sock, PChar(Get)^, Length(Get), 0);
p.s.
Паскаль нужно знать как "отче наш".
-=Germe$=- (2007-05-23 12:26:00) [7]А можно узнать как тогда отправлять?
Сергей М. (2007-05-23 11:42:00) [8]Ты отправил на сервер галиматью, а не текст http-запросаЮ, вот скрипт и не выполняется.
см. формальный и фактический тип 2-го параметра вызова ф-ции send()
-=Germe$=- (2007-05-23 11:36:00) [9]send() возвращает больше 0... Но пхп скрипт не выполняется.
Сергей М. (2007-05-23 11:33:00) [10]
> Отладчик ничего не говорит
Ты у него не спрашивал, вот он ничего и не говорит.
Где анализ результата вызова ф-ции send() ? Нет у тебя его. А раз нет, то и рассуждать о факте доставки данных запроса до сервера попросту бессмысленно.
-=Germe$=- (2007-05-23 11:20:00) [11]Отладчик ничего не говорит. Данные до скрипта не доходят. Вполне возможно, что и до сервера.
Сергей М. (2007-05-23 11:13:00) [12]Что значит "не работает" ?
Что говорит отладчик ?
-=Germe$=- (2007-05-23 10:56:00) [13]Даже так: Adr.sin_addr.S_addr:=inet_addr(pchar('127.0.0.1')); не работает... У меня такое чувство, что сам запрос имеет ошибку...
Сергей М. (2007-05-23 10:45:00) [14]
> Нет.
Печально это, печально.
> в чем проблема?
В том что параметром этой ф-ции должно быть строковое представление IP-адреса, а не имя хоста и уж тем более не URL.
-=Germe$=- (2007-05-23 10:37:00) [15]Нет. А в чем проблема?
Сергей М. (2007-05-23 10:18:00) [16]Здесь
> Sock:=Socket(AF_INET, SOCK_STREAM, 0);
ошибка тобой исправлена.
А здесь
> Adr.sin_addr.S_addr:=inet_addr(pchar(' http://localhost'));
как была, так и осталась.
В справку к ф-ции inet_addr() вникал ?
-=Germe$=- (2007-05-23 10:06:00) [17]Adr.sin_addr.S_addr:=inet_addr(pchar(' http://localhost'));
Sock:=Socket(AF_INET, SOCK_STREAM, 0);
Сергей М. (2007-05-23 10:05:00) [18]приводи исправленный код
-=Germe$=- (2007-05-23 09:59:00) [19]Это уже исправлено, но все равно не работает
Сергей М. (2007-05-23 09:36:00) [20]
> Что не верно?
Как минимум вот это:
> Sock:=Socket(AF_INET, SOCK_DGRAM, 0);
> Adr.sin_addr.S_addr:=inet_addr(pchar(' http://localhost'));