例如我要访问“http://www.baidu.com/home.html”这个页面应该怎么构造封包呢?

解决方案 »

  1.   

    参考:http://blog.csdn.net/unsigned/archive/2008/09/22/2960982.aspx
      

  2.   

    也可以用现成的组件,如TIdHTTP来实现。
      

  3.   

    up unsigned blog
    http://blog.csdn.net/unsigned/archive/2008/09/22/2960982.aspx
      

  4.   

    用的办法可以,不过需要自己组装HTTP,可以使用一些现成的控件,下面是一些方法,HTTP: THTTPSend你可以换成INDY的HTTP控件function HttpGetText(const URL: string; const Response: TStrings; HeaderList: string): Boolean;
    var
      HTTP: THTTPSend;
    begin
      HTTP := THTTPSend.Create;
      try
        if HeaderList <> '' then
          HTTP.Headers.Add(HeaderList);
        Result := HTTP.HTTPMethod('GET', URL);
        Response.LoadFromStream(HTTP.Document);
      finally
        HTTP.Free;
      end;
    end;function HttpGetText(const URL: string; const Response: TStrings;
      const ProxyHost, ProxyPort: string; HeaderList: string): Boolean; overload;
    var
      HTTP: THTTPSend;
    begin
      HTTP := THTTPSend.Create;
      try
        HTTP.ProxyHost := ProxyHost;
        HTTP.ProxyPort := ProxyPort;
        if HeaderList <> '' then
          HTTP.Headers.Add(HeaderList);
        Result := HTTP.HTTPMethod('GET', URL);
        Response.LoadFromStream(HTTP.Document);
      finally
        HTTP.Free;
      end;
    end;function HttpGetBinary(const URL: string; const Response: TStream; HeaderList: string): Boolean;
    var
      HTTP: THTTPSend;
    begin
      HTTP := THTTPSend.Create;
      try
        if HeaderList <> '' then
          HTTP.Headers.Add(HeaderList);
        Result := HTTP.HTTPMethod('GET', URL);
        Response.Seek(0, soFromBeginning);
        Response.CopyFrom(HTTP.Document, 0);
      finally
        HTTP.Free;
      end;
    end;function HttpGetBinary(const URL: string; const Response: TStream;
      const ProxyHost, ProxyPort: string; HeaderList: string): Boolean; overload;
    var
      HTTP: THTTPSend;
    begin
      Result := False;
      HTTP := THTTPSend.Create;
      try
        HTTP.ProxyHost := ProxyHost;
        HTTP.ProxyPort := ProxyPort;
        if HeaderList <> '' then
          HTTP.Headers.Add(HeaderList);
        Result := HTTP.HTTPMethod('GET', URL);
        Response.Seek(0, soFromBeginning);
        Response.CopyFrom(HTTP.Document, 0);
      finally
        HTTP.Free;
      end;
    end;function HttpPostBinary(const URL: string; const Data: TStream): Boolean;
    var
      HTTP: THTTPSend;
    begin
      HTTP := THTTPSend.Create;
      try
        HTTP.Document.CopyFrom(Data, 0);
        HTTP.MimeType := 'Application/octet-stream';
        Result := HTTP.HTTPMethod('POST', URL);
        Data.Seek(0, soFromBeginning);
        Data.CopyFrom(HTTP.Document, 0);
      finally
        HTTP.Free;
      end;
    end;function HttpPostURL(const URL, URLData: string; const Data: TStream): Boolean;
    var
      HTTP: THTTPSend;
    begin
      HTTP := THTTPSend.Create;
      try
        HTTP.Document.Write(Pointer(URLData)^, Length(URLData));
        HTTP.MimeType := 'application/x-www-form-urlencoded';
        Result := HTTP.HTTPMethod('POST', URL);
        Data.CopyFrom(HTTP.Document, 0);
      finally
        HTTP.Free;
      end;
    end;function HttpPostURL(const URL, URLData: string; const Data: TStream;
      const AProxySvr, AProxyPrt: string): Boolean;
    var
      HTTP: THTTPSend;
    begin
      HTTP := THTTPSend.Create;
      try
        HTTP.ProxyHost := AProxySvr;
        HTTP.ProxyPort := AProxyPrt;
        HTTP.Document.Write(Pointer(URLData)^, Length(URLData));
        HTTP.MimeType := 'application/x-www-form-urlencoded';
        Result := HTTP.HTTPMethod('POST', URL);
        Data.CopyFrom(HTTP.Document, 0);
      finally
        HTTP.Free;
      end;
    end;function HttpPostURL(const URL, URLData: string; var Data: string): Boolean; overload;
    var
      AData: TMemoryStream;
      slRet: TStringList;
    begin
      AData := TMemoryStream.Create;
      try
        Result := HttpPostURL(URL, URLData, AData);
        if Result then
        begin
          slRet := TStringList.Create;
          try
            AData.Position := 0;
            slRet.LoadFromStream(AData);
            Data := slRet.Text;
          finally
            slRet.Free;
          end;
        end;
      finally
        AData.Free;
      end;
    end;function HttpPostURL(const URL, URLData: string; var Data: string;
      const AProxySvr, AProxyPrt: string): Boolean; overload;
    var
      AData: TMemoryStream;
      slRet: TStringList;
    begin
      AData := TMemoryStream.Create;
      try
        Result := HttpPostURL(URL, URLData, AData, AProxySvr, AProxyPrt);
        if Result then
        begin
          slRet := TStringList.Create;
          try
            AData.Position := 0;
            slRet.LoadFromStream(AData);
            Data := slRet.Text;
          finally
            slRet.Free;
          end;
        end;
      finally
        AData.Free;
      end;
    end;function HttpPostFile(const URL, FieldName, FileName: string;
      const Data: TStream; const ResultData: TStrings): Boolean;
    var
      HTTP: THTTPSend;
      Bound, s: string;
    begin
      Bound := IntToHex(Random(MaxInt), 8) + '_Synapse_boundary';
      HTTP := THTTPSend.Create;
      try
        s := '--' + Bound + CRLF;
        s := s + 'content-disposition: form-data; name="' + FieldName + '";';
        s := s + ' filename="' + FileName +'"' + CRLF;
        s := s + 'Content-Type: Application/octet-string' + CRLF + CRLF;
        HTTP.Document.Write(Pointer(s)^, Length(s));
        HTTP.Document.CopyFrom(Data, 0);
        s := CRLF + '--' + Bound + '--' + CRLF;
        HTTP.Document.Write(Pointer(s)^, Length(s));
        HTTP.MimeType := 'multipart/form-data; boundary=' + Bound;
        Result := HTTP.HTTPMethod('POST', URL);
        ResultData.LoadFromStream(HTTP.Document);
      finally
        HTTP.Free;
      end;
    end;
      

  5.   

    CLIENTSOCKET连接成功后会调用一次ONWRITE事件,在ONWRITE事件中构建完整的HTTP头,发送给对方就可以,HTTP头可以用抓包软件抓IE的第一个包看看.之后就是ONREAD直到下载完ONDISCONNECT