• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

            路漫漫,長修遠(yuǎn),我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
            數(shù)據(jù)加載中……

            起因源于之前忘記一個adsl的端口,想寫一個端口探測工具,止于sp的訂購關(guān)系包檢測

            雖然只有這么點(diǎn)東西,但我還是做了3天,老了

             一個sp用的wap訂購關(guān)系包調(diào)試檢測工具

             

            /** 程序的核心,一個post線程,用于提交xml數(shù)據(jù)包

            *   作者:劉昆

            *   最后修改日期:  2004-9-23 

            *   以上代碼免費(fèi),若直接引用一下代碼請告知,并保留此注釋

            *   作為一名程序員應(yīng)該有最基本的職業(yè)道德*/

            unit HTTPGetThread;

            interface
            uses classes, SysUtils, wininet, windows;


            type
              TOnProgressEvent = procedure(TotalSize, Readed: Integer) of object;


              THTTPGetThread = class(TThread)

              private
                FTAcceptTypes: string; //接收文件類型 *.*
                FTAgent: string; //瀏覽器名  Nokia6610/1.0 (5.52) Profile/MIDP-1.0 Configuration/CLDC-1.02
                FTURL: string; // url
                FTFileName: string; //文件名
                FTStringResult: AnsiString;
                FTUserName: string; //用戶名
                FTPassword: string; //密碼
                FTPostQuery: string; //方法名,post或者get
                FTReferer: string;
                FTBinaryData: Boolean;
                FTUseCache: Boolean; //是否從緩存讀數(shù)據(jù)
                FTMimeType: string; //Mime類型

                FTResult: Boolean;
                FTFileSize: Integer;
                FTToFile: Boolean; //是否文件

                BytesToRead, BytesReaded: LongWord;

                FTProgress: TOnProgressEvent;
                procedure ParseURL(URL: string; var HostName, FileName: string; var portNO: integer); //取得url的主機(jī)名和文件名
                procedure UpdateProgress;
              protected
                procedure Execute; override;
              public
                procedure setResult(FResult: boolean);
                function getResult(): boolean;
                function getFileName(): string;
                function getToFile(): boolean;
                function getFileSize(): integer;
                function getStringResult(): AnsiString;
                constructor Create(aAcceptTypes, aMimeType, aAgent, aURL, aFileName, aUserName, aPassword, aPostQuery, aReferer: string; aBinaryData, aUseCache: Boolean; aProgress: TOnProgressEvent; aToFile: Boolean);

              end;

            implementation

            { THTTPGetThread }

            constructor THTTPGetThread.Create(aAcceptTypes, aMimeType, aAgent, aURL, aFileName, aUserName, aPassword, aPostQuery, aReferer: string; aBinaryData, aUseCache: Boolean; aProgress: TOnProgressEvent; aToFile: Boolean);
            begin
              FreeOnTerminate := True;
              inherited Create(True);

              FTAcceptTypes := aAcceptTypes;
              FTAgent := aAgent;
              FTURL := aURL;
              FTFileName := aFileName;
              FTUserName := aUserName;
              FTPassword := aPassword;

              //FTPostQuery := aPostQuery;

              FTPostQuery := StringReplace(aPostQuery, #13#10, '', [rfReplaceAll]);

              FTReferer := aReferer;
              FTProgress := aProgress;
              FTBinaryData := aBinaryData;
              FTUseCache := aUseCache;
              FTMimeType := aMimeType;

              FTToFile := aToFile;
              Resume;
            end;

            procedure THTTPGetThread.Execute;
            var
              hSession: hInternet; //回話句柄
              hConnect: hInternet; //連接句柄
              hRequest: hInternet; //請求句柄
              Host_Name: string; //主機(jī)名
              File_Name: string; //文件名
              port_no: integer;

              RequestMethod: PChar;
              InternetFlag: longWord;
              AcceptType: PAnsiChar;
              dwBufLen, dwIndex: longword;
              Buf: Pointer; //緩沖區(qū)
              f: file;
              Data: array[0..$400] of Char;
              TempStr: AnsiString;
              mime_Head: string;

              procedure CloseHandles;
              begin
                InternetCloseHandle(hRequest);
                InternetCloseHandle(hConnect);
                InternetCloseHandle(hSession);
              end;

            begin
              inherited;
              buf := nil;
              try
                try
                  ParseURL(FTURL, Host_Name, File_Name, port_no);

                  if Terminated then begin
                    FTResult := False;
                    Exit;
                  end;
                 //建立會話
                  hSession := InternetOpen(pchar(FTAgent), //lpszCallerName指定正在使用網(wǎng)絡(luò)函數(shù)的應(yīng)用程序
                    INTERNET_OPEN_TYPE_PRECONFIG, //參數(shù)dwAccessType指定訪問類型
                    nil, //服務(wù)器名(lpszProxyName)。 accesstype為GATEWAY_PROXY_INTERNET_ACCESS和CERN_PROXY_ACCESS時
                    nil, //NProxyPort參數(shù)用在CERN_PROXY_INTERNET_ACCESS中用來指定使用的端口數(shù)。使用INTERNET_INVALID_PORT_NUMBER相當(dāng)于提供卻省的端口數(shù)。
                    0); //設(shè)置額外的選擇。你可以使用INTERNET_FLAG_ASYNC標(biāo)志去指示使用返回句句柄的將來的Internet函數(shù)將為回調(diào)函數(shù)發(fā)送狀態(tài)信息,使用InternetSetStatusCallback進(jìn)行此項(xiàng)設(shè)置

                 //建立連接
                  hConnect := InternetConnect(hSession, //會話句柄
                    PChar(Host_Name), //指向包含Internet服務(wù)器的主機(jī)名稱(如
            http://www.mit.edu)或IP地址(如202.102.13.141)的字符串
                    port_no, //INTERNET_DEFAULT_HTTP_PORT, //是將要連結(jié)到的TCP/IP的端口號
                    PChar(FTUserName), //用戶名
                    PChar(FTPassword), //密碼
                    INTERNET_SERVICE_HTTP, //協(xié)議
                    0, // 可選標(biāo)記,設(shè)置為INTERNET_FLAG_SECURE,表示使用SSL/PCT協(xié)議完成事務(wù)
                    0); //應(yīng)用程序定義的值,用來為返回的句柄標(biāo)識應(yīng)用程序設(shè)備場境

                  if FTPostQuery = '' then RequestMethod := 'GET'
                  else RequestMethod := 'POST';

                  if FTUseCache then InternetFlag := 0
                  else InternetFlag := INTERNET_FLAG_RELOAD;

                  AcceptType := PChar('Accept: ' + FTAcceptTypes);

                //建立一個http請求句柄
                  hRequest := HttpOpenRequest(hConnect, //InternetConnect返回的HTTP會話句柄
                    RequestMethod, //指向在申請中使用的"動詞"的字符串,如果設(shè)置為NULL,則使用"GET"
                    PChar(File_Name), //指向包含動詞的目標(biāo)對象名稱的字符串,通常是文件名稱、可執(zhí)行模塊或搜索說明符
                    'HTTP/1.0', //指向包含HTTP版本的字符串,如果為NULL,則默認(rèn)為"HTTP/1.0";
                    PChar(FTReferer), //指向包含文檔地址(URL)的字符串,申請的URL必須是從該文檔獲取的
                    @AcceptType, //指向客戶接收的內(nèi)容的類型
                    InternetFlag,
                    0);
                  mime_Head := 'Content-Type: ' + FTMimeType;
                  if FTPostQuery = '' then
                    FTResult := HttpSendRequest(hRequest, nil, 0, nil, 0)
                  else
                //發(fā)送一個指定請求到httpserver
                    FTResult := HttpSendRequest(hRequest,
                      pchar(mime_Head), //mime 頭
                      length(mime_Head), //頭長度
                      PChar(FTPostQuery), //附加數(shù)據(jù)緩沖區(qū),可為空
                      strlen(PChar(FTPostQuery))); //附加數(shù)據(jù)緩沖區(qū)長度

                  if Terminated then
                  begin
                  //CloseHandles;
                    FTResult := False;
                    Exit;
                  end;

                  dwIndex := 0;
                  dwBufLen := 1024;
                  GetMem(Buf, dwBufLen);

                //接收header信息和一個http請求
                  FTResult := HttpQueryInfo(hRequest,
                    HTTP_QUERY_CONTENT_LENGTH,
                    Buf, //指向一個接收請求信息的緩沖區(qū)的指針
                    dwBufLen, //HttpQueryInfo內(nèi)容的大小
                    dwIndex); //讀取的字節(jié)數(shù)

                  if Terminated then begin
                    FTResult := False;
                    Exit;
                  end;

                  if FTResult or not FTBinaryData then begin //如果請求
                    if FTResult then
                      FTFileSize := StrToInt(StrPas(Buf));

                    BytesReaded := 0;

                    if FTToFile then begin
                      AssignFile(f, FTFileName);
                      Rewrite(f, 1);
                    end else FTStringResult := '';

                    while True do begin
                      if Terminated then begin
                        FTResult := False;
                        Exit;
                      end;

                      if not InternetReadFile(hRequest,
                        @Data, //數(shù)據(jù)內(nèi)容
                        SizeOf(Data), //大小
                        BytesToRead) //讀取的字節(jié)數(shù)
                        then Break
                      else
                        if BytesToRead = 0 then Break
                        else begin
                          if FTToFile then
                            BlockWrite(f, Data, BytesToRead) //將讀出的數(shù)據(jù)寫入文件
                          else begin
                            TempStr := Data;
                            SetLength(TempStr, BytesToRead);
                            FTStringResult := FTStringResult + TempStr;
                          end;

                          inc(BytesReaded, BytesToRead);

                          if Assigned(FTProgress) then //執(zhí)行回調(diào)函數(shù)
                            Synchronize(UpdateProgress);

                        end;
                    end;

                    if FTToFile then
                      FTResult := FTFileSize = Integer(BytesReaded)
                    else begin
                     // SetLength(FTStringResult, BytesReaded);
                      FTResult := BytesReaded <> 0;
                    end;

                  end;
                except
                end;
              finally
                if FTToFile then CloseFile(f);

                if assigned(Buf) then FreeMem(Buf);
                CloseHandles;
              end;
            end;

             

            function THTTPGetThread.getFileName: string;
            begin
              result := FTFileName;
            end;

            function THTTPGetThread.getFileSize: integer;
            begin
              result := FTFileSize;
            end;

            function THTTPGetThread.getResult: boolean;
            begin
              result := FTResult;
            end;

            function THTTPGetThread.getStringResult: AnsiString;
            begin
              result := FTStringResult;
            end;

            function THTTPGetThread.getToFile: boolean;
            begin
              result := FTToFile;
            end;

            procedure THTTPGetThread.ParseURL(URL: string; var HostName, FileName: string; var portNO: integer);
            var
              i: Integer;
            begin
              if Pos('http://', LowerCase(URL)) <> 0 then
                Delete(URL, 1, 7);

              i := Pos('/', URL);
              HostName := Copy(URL, 1, i);
              FileName := Copy(URL, i, Length(URL) - i + 1);

              i := pos(':', hostName);
              if i <> 0 then begin
                portNO := strtoint(copy(hostName, i + 1, length(hostName) - i - 1));
                hostName := copy(hostName, 1, i - 1);
              end else portNO := 80;

              if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then SetLength(HostName, Length(HostName) - 1);
            end;


            procedure THTTPGetThread.setResult(FResult: boolean);
            begin
              FTResult := FResult;
            end;

            procedure THTTPGetThread.UpdateProgress;
            begin
              FTProgress(FTFileSize, BytesReaded);
            end;

            end.

             

            /** 主要用來做線程和界面的交互

            *   作者:劉昆

            *   最后修改日期:  2004-9-23 

            *   以上代碼免費(fèi),若直接引用一下代碼請告知,并保留此注釋

            *   作為一名程序員應(yīng)該有最基本的職業(yè)道德*/

            unit MyHttpGet;

            interface

            uses HTTPGetThread, windows;

            type
              TOnDoneFileEvent = procedure(FileName: string; FileSize: Integer) of object;
              TOnDoneStringEvent = procedure(Result: AnsiString) of object;


              THttpGet = class
              private
                F_URL: string; //目標(biāo)url
                F_GetURLThread: THTTPGetThread; //取數(shù)據(jù)的線程

                F_Accept_Types: string;
                F_Agent: string;
                F_Binary_Data: Boolean;
                F_Use_Cache: Boolean; //是否讀緩存
                F_File_Name: string;
                F_User_Name: string; //用戶名
                F_Password: string; //密碼
                F_PostQuery: string; //方法名
                F_Referer: string;
                F_Mime_Type: string;

                F_Wait_Thread: Boolean;

                FResult: Boolean;

                FProgress: TOnProgressEvent;
                FDoneFile: TOnDoneFileEvent;
                FDoneString: TOnDoneStringEvent;

                procedure ThreadDone(Sender: TObject);

              public
                constructor Create();
                destructor Destroy(); override;
                procedure getFile();
                procedure GetString();
                procedure Abort();
              published
                property WaitThread: Boolean read F_Wait_Thread write F_Wait_Thread;
                property AcceptTypes: string read F_Accept_Types write F_Accept_Types;
                property Agent: string read F_Agent write F_Agent;
                property BinaryData: Boolean read F_Binary_Data write F_Binary_Data;
                property URL: string read F_URL write F_URL;
                property UseCache: Boolean read F_Use_Cache write F_Use_Cache;
                property FileName: string read F_File_Name write F_File_Name;
                property UserName: string read F_User_Name write F_User_Name;
                property Password: string read F_Password write F_Password;
                property PostQuery: string read F_PostQuery write F_PostQuery;
                property Referer: string read F_Referer write F_Referer;
                property MimeType: string read F_Mime_Type write F_Mime_Type;

                property OnDoneFile: TOnDoneFileEvent read FDoneFile write FDoneFile;
                property OnDoneString: TOnDoneStringEvent read FDoneString write FDoneString;
              end;

            implementation

             

            { THttpGet }

            procedure THttpGet.Abort;
            begin
              if Assigned(F_GetURLThread) then
              begin
                F_GetURLThread.Terminate;
                F_GetURLThread.setResult(false);
              end;
            end;

            constructor THttpGet.Create;
            begin
              F_Accept_Types := '*/*';
              F_Agent := 'Nokia6610/1.0 (5.52) Profile/MIDP-1.0 Configuration/CLDC-1.02';
            end;

            destructor THttpGet.Destroy;
            begin

            end;

            procedure THttpGet.getFile;
            var
              Msg: TMsg;
            begin
              if not Assigned(F_GetURLThread) then
              begin
                F_GetURLThread := THTTPGetThread.Create(F_Accept_Types,F_Mime_Type, F_Agent, F_URL, F_File_Name, F_User_Name, F_Password, F_PostQuery, F_Referer, F_Binary_Data, F_Use_Cache, FProgress, true);
                F_GetURLThread.OnTerminate := ThreadDone;
                if F_Wait_Thread then
                  while Assigned(F_GetURLThread) do
                    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
                    begin
                      TranslateMessage(Msg);
                      DispatchMessage(Msg);
                    end;
              end
            end;

            procedure THttpGet.GetString;
            var
              Msg: TMsg;
            begin
              if not Assigned(F_GetURLThread) then
              begin
                F_GetURLThread := THTTPGetThread.Create(F_Accept_Types,F_Mime_Type,F_Agent, F_URL, F_File_Name, F_User_Name, F_Password, F_PostQuery, F_Referer, F_Binary_Data, F_Use_Cache, FProgress, False);
                F_GetURLThread.OnTerminate := ThreadDone;
                if F_Wait_Thread then
                  while Assigned(F_GetURLThread) do
                    while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
                      TranslateMessage(Msg);
                      DispatchMessage(Msg);
                    end;
              end
            end;

            procedure THttpGet.ThreadDone(Sender: TObject);
            begin
              FResult := F_GetURLThread.getResult;
              if FResult then
                if F_GetURLThread.getToFile then begin
                  if Assigned(FDoneFile) then FDoneFile(F_GetURLThread.getFileName, F_GetURLThread.getFileSize)
                end else
                  if Assigned(FDoneString) then FDoneString(F_GetURLThread.getStringResult);

                //end else if Assigned(FError) then FError(Self);
              F_GetURLThread := nil;
            end;

            end.

             

            /** 程序主界面

            *   作者:劉昆

            *   最后修改日期:  2004-9-23 

            *   以上代碼免費(fèi),若直接引用一下代碼請告知,并保留此注釋

            *   作為一名程序員應(yīng)該有最基本的職業(yè)道德*/

            unit MainForm;

            interface

            uses
              Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
              Dialogs, StdCtrls, ExtCtrls, MyHttpGet;

            type
              TMain = class(TForm)
                Panel1: TPanel;
                Edit1: TEdit;
                Label1: TLabel;
                Panel2: TPanel;
                Panel3: TPanel;
                GroupBox1: TGroupBox;
                MeSend: TMemo;
                GroupBox2: TGroupBox;
                MeReceive: TMemo;
                Button1: TButton;
                CbSave: TCheckBox;
                Edit2: TEdit;
                Label2: TLabel;
                procedure Button1Click(Sender: TObject);
              private
                { Private declarations }
                procedure onGetString(Result: AnsiString);
                procedure onGetFile(FileName: string; FileSize: Integer);

              public
                { Public declarations }
              end;

            var
              Main: TMain;

            implementation

            {$R *.dfm}


            procedure TMain.Button1Click(Sender: TObject);
            var hg: THttpGet;
              strs: TStrings;
              i: Integer;
            begin
              hg := nil;
              strs := nil;
              try
                strs := TStringList.Create;
                hg := THttpGet.Create;
                hg.WaitThread := false;
                hg.AcceptTypes := '*.*';

                hg.Agent := 'Nokia6610/1.0 (5.52) Profile/MIDP-1.0 Configuration/CLDC-1.02';
                hg.BinaryData := false;
                hg.URL := 'Http://' + Edit1.Text;
                hg.UseCache := false;
                hg.FileName := 'provison.xml';
                hg.UserName := '';
                hg.Password := '';

                for i := 0 to MeSend.Lines.Count - 1 do
                  strs.Add(trim(MeSend.Lines[i]));

                hg.PostQuery := strs.Text;
                hg.Referer := 'Http://' + Edit1.Text; //text/plain
                hg.MimeType := Edit2.Text;
                hg.OnDoneString := onGetString;
                hg.OnDoneFile := onGetFile;

                hg.GetString;
              finally
                strs.Free;
                hg.Free;
              end;
            end;


            procedure TMain.onGetFile(FileName: string; FileSize: Integer);
            begin

            end;

            procedure TMain.onGetString(Result: AnsiString);
            begin
              MeReceive.Lines.Text := Result;
            end;

            end.



            posted on 2004-11-12 03:25 Khan 閱讀(815) 評論(0)  編輯 收藏 引用 所屬分類: Delphi

            亚洲精品乱码久久久久久蜜桃图片 | 99久久精品影院老鸭窝| 久久中文字幕人妻丝袜| 亚洲精品美女久久久久99小说| 三级韩国一区久久二区综合| 伊人久久综合无码成人网| 久久国产精品久久精品国产| 久久久久无码中| 99久久777色| 久久人人爽人人爽人人片AV东京热| 97久久国产亚洲精品超碰热| 亚洲国产天堂久久综合| 97久久超碰国产精品旧版| 国产精品久久久久久久久软件| 国产午夜精品理论片久久影视| 亚州日韩精品专区久久久| 久久不射电影网| 久久国产高潮流白浆免费观看| 欧美一级久久久久久久大片| 久久国产免费观看精品| 亚洲欧美日韩久久精品第一区| 久久99精品久久久久久野外| 久久精品国产精品亚洲毛片| 东方aⅴ免费观看久久av| 久久强奷乱码老熟女| 99国产欧美精品久久久蜜芽| 久久伊人五月天论坛| 久久久久免费精品国产| 久久精品中文无码资源站| 亚洲精品午夜国产va久久| 久久久WWW成人免费毛片| 久久99精品国产99久久6| 国产成人久久精品麻豆一区| 国产精品久久永久免费| 久久99国产精品久久99果冻传媒| 无码人妻久久久一区二区三区| 久久精品国产亚洲AV影院| 伊人久久综合成人网| 香蕉久久av一区二区三区| 亚洲国产精品无码久久一区二区| 亚洲国产精品久久久天堂|