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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
6-11642
BlackSun
2003-10-05 18:21
2003.12.04
Отправка письма с маленьких exe-шником


6-11663
duny
2003-10-07 18:26
2003.12.04
Отправка почты с вложением файла


9-11575
greenrul
2003-05-19 02:55
2003.12.04
Реализация изменцивых от ситуации диалогов в RPG:


6-11692
Виноградов Алексей
2003-10-03 19:14
2003.12.04
Сервер на TServersocket и несколько клиентов.Многопоточность (+)


4-11750
lamorg
2003-10-10 17:31
2003.12.04
Как установить ani-курсор