Форум: "Сети";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
ВнизРабота с сокетами Найти похожие ветки
← →
Vilux (2003-10-10 14:25) [0]ПОмогите, пожалуйста, мастера, разобраться. Проблема ниже...
Использую кусок кода :
// Формирование url
Buf:="GET http://www.mail.ru HTTP/1.0";
// Отправка данных
send(sock2,Buf[1],length(Buf),0);//отправка вроде происходит
// Получение 300 байт
setlength(Buf,300);
x:=recv(sock2,Buf[1],300,0);<<<-------------дальше этой строчки прога не хочет работать...не выдает никакой ошибки, ничего...видно не может получить ответ от сервера...
if x<300 then
exit;
Полный код следующий...
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, WinSock;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
// Описание процесса
type
TScan = class(TThread)
sock2: TSocket;
addr: TSockAddrIn;
WSAData: TWSAData;
private
procedure CSGet;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
Sock : TScan;
Rez : boolean = false;
const
// Адрес прокси.
HTTPserv = "proxy.xl.ru";
implementation
// Для преобразование имени
type
TaPInAddr = array [0..255] of PInAddr;
PaPInAddr = ^TaPInAddr;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
// Запуск / Остановка
procedure TForm1.Button1Click(Sender: TObject);
var
J0 : Integer;
begin
if Rez then
begin
Rez:=false;
try
Sock.Terminate;
except
end;
end
else
begin
Application.ProcessMessages;
Rez:=true;
Sock:=TScan.Create(false);
end;
end;
// Инициализация процесса
procedure TScan.Execute;
var
iaddr, x0 : Integer;
ph : PHostEnt;
pptr : PaPInAddr;
InAddr : TInAddr;
begin
try
// Инициализация сокета
WSAStartUp(257, WSAData);
sock2:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if sock2=INVALID_SOCKET then
begin
try
closesocket(sock2);
except
end;
try
Terminate;
except
end;
exit;
end;
// Получение адреса
iaddr := inet_addr(HTTPserv);
if iaddr <=0 then
begin
// Если имя, а не IP
ph := gethostbyname(HTTPserv);
if ph = nil then
begin
try
closesocket(sock2);
except
end;
try
Terminate;
except
end;
exit;
end;
pptr := PaPInAddr(ph^.h_addr_list);
x0 := 0;
while pptr^[x0] <> nil do
begin
InAddr:= pptr^[x0]^;
inc(x0);
addr.sin_addr:=inaddr;
addr.sin_family := AF_INET;
// Порт прокси - 80, 3128, 80808 и т.п.
addr.sin_port := htons(80);
if (connect(sock2, addr, sizeof(addr))) = 0 then
break
end;
end
else
begin
// Если IP
addr.sin_addr.S_addr:=iaddr;
addr.sin_family := AF_INET;
// Порт прокси - 80, 3128, 80808 и т.п.
addr.sin_port := htons(80);
addr.sin_family := AF_INET;
if (connect(sock2, addr, sizeof(addr))) > 0 then
begin
try
closesocket(sock2);
except
end;
try
Terminate;
except
end;
exit;
end;
end;
// Запуск цикла
while true do
begin
CSGet;
if (not Rez) then
break;
end;
except
end;
try
Terminate;
except
end;
Form1.Button1.Caption:="Start";
Rez:=false;
Application.ProcessMessages;
end;
procedure TScan.CSGet;
var
x : Integer;
Buf : string;
begin
Application.ProcessMessages;
try
// Формирование url
Buf:="GET http://www.mail.ru HTTP/1.0";
// Отправка данных
send(sock2,Buf[1],length(Buf),0);
// Получение 300 байт
setlength(Buf,300);
x:=recv(sock2,Buf[1],300,0);
if x<300 then
exit;
setlength(Buf,300);
// Если нужный ответ
if pos("check",Buf)>0 then
begin
Rez:=false;
Application.MessageBox("Нужный ответ получен","Information");
exit;
end;
except
end;
end;
end.
← →
Reindeer Moss Eater (2003-10-10 14:28) [1]Заголовок HTTP должен оканчиваться двумя CRLN
← →
Reindeer Moss Eater (2003-10-10 14:28) [2]заголовок HTTP запроса
← →
Vilux (2003-10-10 17:34) [3]Спасибо, это помогло, но тепер другая проблема... как мне отправить запрос в несколько строк, чтобы там передавались данные формы, допустим кусок ниже... пробую засунуть его в строку, и отправить, но приходит ответ
HTTP/1.1 400 Bad Request
Via: 1.0 MXCTZDC01
Content-Type: text/html; charset=iso-8859-1
Date: Fri, 10 Oct 2003 13:32:56 GMT
Server: Apache/1.3.27 (Unix) mod_ssl/2.8.12 OpenSSL/0.9.6g PHP/4.2.3 rus/PL30.16
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD><BODY>
<H1>Bad Request</H1>
Your browser sent a request that this server could not understand.<P>
Request header field is missing colon separator.<P>
<PRE>
application/x-shockwave-flash, */*</PRE>
<P>
<HR>
<ADDRESS>Apache/1.3.27 Server at www6.hotbox.ru Port 80</ADDRESS>
</BODY></HTML>
А это кусок, который я отправляю...и который засовываю в строку..
POST http://www.mail333.com/login.php HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://www.mail333.com/
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Host: www.mail333.com
Content-Length: 87
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cookie: Apache=xxx.xxx.xxx.xxx.780241065792236323; hotlog=1
reason=login&lng=ru&user=user&domain=mail333.com&pass=pass&serid=0&rememb=nothing
← →
Reindeer Moss Eater (2003-10-10 17:39) [4]как мне отправить запрос в несколько строк
Точно так же. И в конце две CRLN
← →
Vilux (2003-10-10 18:04) [5]Да уже разобрался... вот нашел...
the reason is simply...after the header you must send two CrLf! :D
so HEADER & vbCrLf & vbCrLf & POST DATA
it works :P
и еще
The value of the Content-Length header field must be equal to lenght of the entity.
← →
Ketmar (2003-10-10 19:09) [6]мда. тяжело изобретать то, о чём уже написано в стандартах, правда?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.12.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c