Тема: Delphi & WinSock
Показать сообщение отдельно
  #3  
Старый 27.05.2010, 20:15
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну если в цикле ожидать ответ сервера, то сокет должен быть блокируемым, имхо
пример автризации на одном форуме :
PHP код:
unit Unit1;

interface

uses
  ScktComp
,
  
WindowsMessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrls;

type
  TForm1 
= class(TForm)
    
Button1TButton;
    
Memo1TMemo;
    
procedure Button1Click(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(SenderTObject);
var
  
clientsocketTClientSocket;
  
requestString;
  
request_dataString;
  
savetickcountCardinal;
  
cChar;
  
responseString;

  
usernameString;
  
passwordString;

begin

  username
:='**********';
  
password:='**********';

  
clientsocket:=TClientSocket.Create(Self);
  try
    
clientsocket.ClientType:=ctBlocking;
    
clientsocket.Port:=80;
    
clientsocket.Host:='forum29.ru';
    
clientsocket.Open;
    try
      
//  post данные
      
request_data:='vb_login_username='+username+'&vb_login_password='+password+'&cookieuser=1&s=&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf=';
      
//  готовим post запрос
      
request:='';
      
request:=request+'POST /login.php?do=login HTTP/1.1'+#13#10;
      
request:=request+'Host: forum29.ru'+#13#10;
      
request:=request+'Connection: close'+#13#10;
      
request:=request+'Proxy-Connection: close'+#13#10;
      
request:=request+'User-Agent: Mozilla/4.0'+#13#10;
      
request:=request+'Content-Type: application/x-www-form-urlencoded'+#13#10;
      
request:=request+'Content-Length: '+IntToStr(Length(request_data))+#13#10;
      
request:=request+#13#10;
      //  отсылаем серверу
      
clientsocket.Socket.SendText(request);
      
clientsocket.Socket.SendText(request_data);
      
//  то что послали серверу
      
Memo1.Lines.Add(request);
      
Memo1.Lines.Add(request_data);
      
Memo1.Lines.Add('--');
      
//  теперь читаем его ответ
      //  читаем заголовок ответа
      //  1 мин таймаут
      
savetickcount:=GetTickCount;
      
response:='';
      while 
clientsocket.Socket.Connected and (GetTickCount-savetickcount<60000) do
      
begin
        
if clientsocket.Socket.ReceiveLength>0 then
        begin
          clientsocket
.Socket.ReceiveBuf(c1);
          
response:=response+c;
          if (
Length(response)>=4) and (Copy(responseLength(response)-34)=#13#10#13#10) then Break;
        
end else Sleep(10);
      
end;
      
//  вот заголовок
      //  чтобы собрать куки обрабатываем строки с Set-Cookie
      //  response можно засунуть в отдельный TStrings, чтобы удобней было его парсить
      
Memo1.Lines.Add(response);
      
Memo1.Lines.Add('--');
      
//  читаем страницу
      //  т.к. этот сервер передает чанками
      //  Transfer-Encoding: chunked
      //  ждем ответа макс 10 сек
      //  либо "руками" обрабатываем чанки и выходим когда все принято
      //  но это уже совсем другая история
      //  конечно проще когда есть Content-Length в заголовке, имхо
      
savetickcount:=GetTickCount;
      
response:='';
      while 
clientsocket.Socket.Connected and (GetTickCount-savetickcount<10000) do
      
begin
        
if clientsocket.Socket.ReceiveLength>0 then
        begin
          clientsocket
.Socket.ReceiveBuf(c1);
          
response:=response+c;
        
end;
      
end;
      
//  вот страница
      
Memo1.Lines.Add(response);
      
Memo1.Lines.Add('--');
    
finally
      clientsocket
.Close;
    
end;
  
finally
    clientsocket
.Free;
  
end;
end;

end
Ответить с цитированием