CapIp.pas
上传用户:rickyhu
上传日期:2007-05-27
资源大小:842k
文件大小:18k
源码类别:

控制台编程

开发平台:

Delphi

  1. unit CapIp;
  2. interface
  3. uses
  4.   Windows, Messages,Classes,winsock,sysutils;
  5. const
  6.   WM_CapIp = WM_USER + 200;
  7.                
  8.   STATUS_FAILED        =$FFFF; //定义异常出错代码
  9.   MAX_PACK_LEN         =65535; //接收的最大IP报文
  10.   MAX_ADDR_LEN         =16; //点分十进制地址的最大长度
  11.   MAX_PROTO_TEXT_LEN   =16; //子协议名称(如"TCP")最大长度
  12.   MAX_PROTO_NUM        =12; //子协议数量
  13.   MAX_HOSTNAME_LAN     =255; //最大主机名长度
  14.   CMD_PARAM_HELP       =true;
  15.   IOC_IN               =$80000000;
  16.   IOC_VENDOR           =$18000000;
  17.   IOC_out              =$40000000;
  18.   SIO_RCVALL           =IOC_IN or IOC_VENDOR or 1;// or IOC_out;
  19.   SIO_RCVALL_MCAST     =IOC_IN or IOC_VENDOR or 2;
  20.   SIO_RCVALL_IGMPMCAST =IOC_IN or IOC_VENDOR or 3;
  21.   SIO_KEEPALIVE_VALS   =IOC_IN or IOC_VENDOR or 4;
  22.   SIO_ABSORB_RTRALERT  =IOC_IN or IOC_VENDOR or 5;
  23.   SIO_UCAST_IF         =IOC_IN or IOC_VENDOR or 6;
  24.   SIO_LIMIT_BROADCASTS =IOC_IN or IOC_VENDOR or 7;
  25.   SIO_INDEX_BIND       =IOC_IN or IOC_VENDOR or 8;
  26.   SIO_INDEX_MCASTIF    =IOC_IN or IOC_VENDOR or 9;
  27.   SIO_INDEX_ADD_MCAST  =IOC_IN or IOC_VENDOR or 10;
  28.   SIO_INDEX_DEL_MCAST  =IOC_IN or IOC_VENDOR or 11;
  29. type 
  30.   tcp_keepalive=record
  31.       onoff:Longword;
  32.       keepalivetime:Longword;
  33.       keepaliveinterval:Longword;
  34. end;
  35. // New WSAIoctl Options
  36. //IP头
  37. type
  38.   _iphdr=record
  39.       h_lenver        :byte; //4位首部长度+4位IP版本号
  40.       tos             :char; //8位服务类型TOS
  41.       total_len       :char; //16位总长度(字节)
  42.       ident           :word; //16位标识
  43.       frag_and_flags  :word;         //3位标志位
  44.       ttl             :byte;    //8位生存时间 TTL
  45.       proto           :byte;    //8位协议 (TCP, UDP 或其他)
  46.       checksum        :word; //16位IP首部校验和
  47.       sourceIP :Longword; //32位源IP地址
  48.       destIP          :Longword; //32位目的IP地址
  49. end;
  50. IP_HEADER=_iphdr;
  51. type 
  52.   _tcphdr=record      //定义TCP首部
  53.       TCP_Sport        :word;    //16位源端口
  54.       TCP_Dport        :word;    //16位目的端口
  55.       th_seq          :longword; //32位序列号
  56.       th_ack          :longword; //32位确认号
  57.       th_lenres       :byte;    //4位首部长度/6位保留字
  58.       th_flag         :char;   //6位标志位
  59.       th_win          :word;   //16位窗口大小
  60.       th_sum          :word;        //16位校验和
  61.       th_urp          :word;        //16位紧急数据偏移量
  62. end;
  63. TCP_HEADER=_tcphdr;
  64. type 
  65.   _udphdr=record       //定义UDP首部
  66.       uh_sport          :word; //16位源端口
  67.       uh_dport          :word; //16位目的端口
  68.       uh_len            :word;       //16位长度
  69.       uh_sum            :word;       //16位校验和
  70. end;
  71. UDP_HEADER=_udphdr;
  72. type 
  73.   _icmphdr=record       //定义ICMP首部
  74.       i_type          :byte;       //8位类型
  75.       i_code          :byte;       //8位代码
  76.       i_cksum         :word;       //16位校验和
  77.       i_id            :word;       //识别号(一般用进程号作为识别号)
  78. //      i_seq           :word;       //报文序列号
  79.       timestamp       :word;       //时间戳
  80. end;
  81. ICMP_HEADER=_icmphdr;
  82. type 
  83.   _protomap=record //定义子协议映射表
  84.       ProtoNum    :integer;
  85.       ProtoText   :array[0..MAX_PROTO_TEXT_LEN] of char;
  86. end;
  87. TPROTOMAP=_protomap;
  88. type
  89.   ESocketException   = class(Exception);
  90.   TWSAStartup            = function (wVersionRequired: word;
  91.                                        var WSData: TWSAData): Integer; stdcall;
  92.   TOpenSocket            = function (af, Struct, protocol: Integer): TSocket; stdcall;
  93.   TInet_addr             = function (cp: PChar): u_long; stdcall;
  94.   Thtons                 = function (hostshort: u_short): u_short; stdcall;
  95.   TConnect               = function (s: TSocket; var name: TSockAddr;
  96.                                        namelen: Integer): Integer; stdcall;
  97.   TWSAIoctl              = function (s: TSocket; cmd: DWORD;lpInBuffer: PCHAR;
  98.                                  dwInBufferLen:DWORD;lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
  99.                                  lpdwOutBytesReturned: LPDWORD;lpOverLapped: POINTER;
  100.                                  lpOverLappedRoutine: POINTER): Integer; stdcall;
  101.   TCloseSocket           = function (s: TSocket): Integer; stdcall;
  102.   Tsend                  = function( s:TSOCKET; buf:pchar;Len:integer;flags:integer):Integer;stdcall;
  103.   Trecv                  = function( s:TSOCKET; var buf;Len:integer;flags:integer):Integer;stdcall;
  104.   TWSAAsyncSelect        =function (s: TSocket; HWindow: HWND; wMsg: u_int; lEvent: Longint): Integer; stdcall;
  105.   TWSACleanup            =function():integer;stdcall;
  106.   //TOnCap = procedure(ip,proto,sourceIP,destIP,SourcePort,DestPort: string;
  107.   //                     header:pchar;header_size:integer;data:pchar;data_size:integer) of object;
  108.   //TOnCap = procedure(dateStr,timeStr,protoType,PaKnum,direct,proto,Flag,
  109.   //                     remoteIP,DestPort,data_size: string) of object;
  110.   TOnCap = procedure(Allinfo:string) of object;
  111.   TOnError = procedure(Error : string) of object;
  112.    TCapIp = class
  113.   private
  114.     Fhand_dll   :HModule;         // Handle for mpr.dll
  115.     FWindowHandle : HWND;
  116.     FOnCap      :TOnCap;          //捕捉数据的事件
  117.     FOnError    :TOnError;        //发生错误的事件
  118.     Fsocket     :array of Tsocket;
  119.     FActiveIP   :array of string; //存放可用的IP
  120.     FWSAStartup            : TWSAStartup;
  121.     FOpenSocket            : TOpenSocket;
  122.     FInet_addr             : TInet_addr;
  123.     Fhtons                 : Thtons;
  124.     FConnect               : TConnect;
  125.     FCloseSocket           : TCloseSocket;
  126.     Fsend                  :Tsend;
  127.     FWSAIoctl              :TWSAIoctl;
  128.     Frecv                  :Trecv;
  129.     FWSACleanup            :TWSACleanup;
  130.     FWSAAsyncSelect        :TWSAAsyncSelect;
  131.     direct,proto,Flag,remoteIP,DestPort,data_size:string;
  132.     localIp:string;
  133.   protected
  134.     procedure   WndProc(var MsgRec: TMessage);
  135.     //IP解包函数
  136.     function DecodeIpPack(ip:string;buf:pchar;iBufSize:integer):integer;
  137.     //TCP解包函数
  138.     //function DecodeTcpPack(TcpBuf:pchar;iBufSize:integer):integer;
  139.     //UDP解包函数
  140.     //function DecodeUdpPack(p:pchar;i:integer):integer;
  141.     //ICMP解包函数
  142.     //function DecodeIcmpPack(p:pchar;i:integer):integer;
  143.     //协议检查
  144.     function  CheckProtocol(iProtocol:integer):string;
  145.     procedure CapIp(socket_no:integer);
  146.     //得当前的IP列表
  147.     procedure get_ActiveIP;
  148.     //设置网卡状态
  149.     procedure set_socket_state;
  150.     //出错处理函数
  151.     function  CheckSockError(iErrorCode:integer):boolean;
  152.   public
  153.     Fpause                 :boolean;//暂停
  154.     Finitsocket            :boolean;//是否已初始化
  155.     constructor Create();
  156.     destructor  Destroy; override;
  157.     function    init_socket:boolean;//初始化
  158.     procedure   StartCap;//开始捕捉
  159.     procedure   pause;   //暂停
  160.     procedure   StopCap;//结束捕捉
  161.     property    Handle   : HWND       read FWindowHandle;
  162.   published
  163.     property    OnCap    : TOnCap     read  FOnCap write FOnCap;
  164.     property    OnError  : TOnError   read  FOnError write FOnError;
  165. end;
  166. implementation
  167. function XSocketWindowProc(ahWnd   : HWND;auMsg   : Integer;awParam : WPARAM; alParam : LPARAM): Integer; stdcall;
  168. var
  169.   Obj    : TCapIp;
  170.   MsgRec : TMessage;
  171. begin
  172.   { At window creation ask windows to store a pointer to our object       }
  173.   {GetWindowLong:his function returns the 32 bit value at the specified   }
  174.   {offset into the extra window memory for the specified window.          }
  175.   Obj := TCapIp(GetWindowLong(ahWnd, 0));
  176.   { If the pointer is not assigned, just call the default procedure       }
  177.   {  DefWindowProc: This function ensures that all incoming
  178.                        Windows messages are processed. }
  179.   if not Assigned(Obj) then
  180.     Result := DefWindowProc(ahWnd, auMsg, awParam, alParam)
  181.   else
  182.   begin
  183.     { Delphi use a TMessage type to pass paramter to his own kind of    }
  184.     { windows procedure. So we are doing the same...                    }
  185.     MsgRec.Msg    := auMsg;
  186.     MsgRec.wParam := awParam;
  187.     MsgRec.lParam := alParam;
  188.     Obj.WndProc(MsgRec);
  189.     Result := MsgRec.Result;
  190.   end;
  191. end;
  192. var
  193.   XSocketWindowClass: TWndClass = (
  194.           style         : 0;
  195.           lpfnWndProc   : @XSocketWindowProc;
  196.           cbClsExtra    : 0;
  197.           cbWndExtra    : SizeOf(Pointer);
  198.           hInstance     : 0;
  199.           hIcon         : 0;
  200.           hCursor       : 0;
  201.           hbrBackground : 0;
  202.           lpszMenuName  : nil;
  203.           lpszClassName : 'TCapIp');
  204. function XSocketAllocateHWnd(Obj : TObject): HWND;
  205. var
  206.   TempClass       : TWndClass;
  207.   ClassRegistered : Boolean;
  208. begin
  209.   { Check if the window class is already registered                       }
  210.   XSocketWindowClass.hInstance := HInstance;
  211.   ClassRegistered := GetClassInfo(HInstance,
  212.                                     XSocketWindowClass.lpszClassName,
  213.                                     TempClass);
  214.   if not ClassRegistered then
  215.   begin
  216.   { Not yet registered, do it right now                                }
  217.     Result := Windows.RegisterClass(XSocketWindowClass);
  218.     if Result = 0 then
  219.       Exit;
  220.   end;
  221.   { Now create a new window                                               }
  222.   Result := CreateWindowEx(WS_EX_TOOLWINDOW,
  223.                            XSocketWindowClass.lpszClassName,
  224.                            '',        { Window name   }
  225.                            WS_POPUP,  { Window Style  }
  226.                            0, 0,      { X, Y          }
  227.                            0, 0,      { Width, Height }
  228.                            0,         { hWndParent    }
  229.                            0,         { hMenu         }
  230.                            HInstance, { hInstance     }
  231.                            nil);      { CreateParam   }
  232.   { if successfull, the ask windows to store the object reference         }
  233.   { into the reserved byte (see RegisterClass)                            }
  234.   if (Result <> 0) and Assigned(Obj) then
  235.     SetWindowLong(Result, 0, Integer(Obj));
  236. end;
  237. procedure XSocketDeallocateHWnd(Wnd: HWND);
  238. begin
  239.   DestroyWindow(Wnd);
  240. end;
  241. procedure TCapIp.get_ActiveIP;
  242. type
  243.   TaPInAddr = Array[0..20] of PInAddr;
  244.   PaPInAddr = ^TaPInAddr;
  245. var
  246.   phe: PHostEnt;
  247.   pptr: PaPInAddr;
  248.   Buffer: Array[0..63] of Char;
  249.   I: Integer;
  250. begin
  251.   setlength(FActiveIP,20);
  252.   GetHostName(Buffer, SizeOf(Buffer));
  253.   phe := GetHostByName(buffer);
  254.   if phe = nil then
  255.   begin
  256.     setlength(FActiveIP,0);
  257.     if Assigned(FOnError) then
  258.       FOnError('没有找到可绑定的IP!');
  259.     exit;
  260.   end;
  261.   pPtr:= PaPInAddr(phe^.h_addr_list);
  262.   I:= 0;
  263.   while (pPtr^[I] <> nil) and (i<20) do
  264.   begin
  265.     FActiveIP[I]:=inet_ntoa(pptr^[I]^);
  266.     Inc(I);
  267.   end;
  268.   setlength(FActiveIP,i);
  269.   localIp:=FActiveIP[i-1];
  270. end;
  271. procedure TCapIp.set_socket_state;
  272. var
  273.   i,iErrorCode:integer;
  274.   sa: tSockAddrIn;
  275.   dwBufferLen:array[0..10]of DWORD;
  276.   dwBufferInLen:DWORD;
  277.   dwBytesReturned:DWORD;
  278. begin
  279.   if high(FActiveIP)=-1 then
  280.     exit;
  281.   setlength(Fsocket,high(FActiveIP)+1);
  282.   for i:=0 to high(FActiveIP) do
  283.   begin
  284.     Fsocket[i]:= socket(AF_INET , SOCK_RAW , IPPROTO_IP);
  285.     sa.sin_family:= AF_INET;
  286.     sa.sin_port := htons(i);
  287.     sa.sin_addr.S_addr:=Inet_addr(pchar(FActiveIP[i]));
  288.     iErrorCode := bind(Fsocket[i],sa, sizeof(sa));
  289.     CheckSockError(iErrorCode);
  290.     dwBufferInLen :=1;
  291.     dwBytesReturned:=0;
  292.     //receive all packages !
  293.     iErrorCode:=FWSAIoctl(Fsocket[i], SIO_RCVALL,@dwBufferInLen, sizeof(dwBufferInLen),
  294.       @dwBufferLen, sizeof(dwBufferLen),@dwBytesReturned ,nil ,nil);
  295.     CheckSockError(iErrorCode);
  296.     iErrorCode:=WSAAsyncSelect(Fsocket[i],FWindowHandle,WM_CapIp+i,FD_READ or FD_CLOSE);
  297.     CheckSockError(iErrorCode);
  298.   end;
  299. end;
  300. procedure TCapIp.CapIp(socket_no:integer);
  301. var
  302.   iErrorCode:integer;
  303.   RecvBuf:array[0..MAX_PACK_LEN] of char;
  304. begin
  305.   fillchar(RecvBuf,sizeof(RecvBuf),0);
  306.   iErrorCode := frecv(Fsocket[socket_no], RecvBuf, sizeof(RecvBuf), 0);
  307.   CheckSockError(iErrorCode);
  308.   data_size:=inttostr(iErrorCode);
  309.   if not Fpause then
  310.   begin
  311.     iErrorCode := DecodeIpPack(FActiveIP[socket_no],RecvBuf, iErrorCode);
  312.     CheckSockError(iErrorCode);
  313.   end;
  314. end;
  315. function TCapIp.CheckProtocol(iProtocol:integer):string;
  316. begin
  317.   result:='';
  318.   case iProtocol of
  319.     IPPROTO_IP   :result:='IP';
  320.     IPPROTO_ICMP :result:='ICMP';
  321.     IPPROTO_IGMP :result:='IGMP';
  322.     IPPROTO_GGP  :result:='GGP';
  323.     IPPROTO_TCP  :result:='TCP';
  324.     IPPROTO_PUP  :result:='PUP';
  325.     IPPROTO_UDP  :result:='UDP';
  326.     IPPROTO_IDP  :result:='IDP';
  327.     IPPROTO_ND   :result:='NP';
  328.     IPPROTO_RAW  :result:='RAW';
  329.     IPPROTO_MAX  :result:='MAX';
  330.   else
  331.     result:='';
  332.   end;
  333. end;
  334. function TCapIp.DecodeIpPack(ip:string;buf:pchar;iBufSize:integer):integer;
  335. var
  336. //  LSourcePort,LDestPort:word;
  337.   LDestPort:word;
  338.   iProtocol, iTTL:integer;
  339.   szProtocol :array[0..MAX_PROTO_TEXT_LEN] of char;
  340.   szSourceIP :array[0..MAX_ADDR_LEN] of char;
  341.   szDestIP   :array[0..MAX_ADDR_LEN] of char;
  342.   pIpheader:IP_HEADER;
  343.   pTcpHeader:TCP_HEADER;
  344.   pUdpHeader:UDP_HEADER;
  345.   pIcmpHeader:ICMP_HEADER;
  346.   saSource, saDest:TSockAddrIn;
  347.   iIphLen:integer;
  348. //  TcpHeaderLen:integer;
  349. //  TcpData:pchar;
  350.   AllInfo:string;
  351. begin
  352.   result:=0;
  353.   CopyMemory(@pIpheader,buf,sizeof(pIpheader));
  354.   iProtocol := pIpheader.proto;
  355.   StrLCopy(szProtocol, pchar(CheckProtocol(iProtocol)),15);
  356.   saSource.sin_addr.s_addr := pIpheader.sourceIP;
  357.   strlcopy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
  358.   saDest.sin_addr.s_addr := pIpheader.destIP;
  359.   strLcopy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
  360. iTTL := pIpheader.ttl;
  361.   Flag:='0';
  362.   iIphLen :=sizeof(pIpheader);
  363.   case iProtocol of
  364.     IPPROTO_TCP :
  365.                 begin
  366.                   CopyMemory(@pTcpHeader,buf+iIphLen,sizeof(pTcpHeader));
  367.                   //LSourcePort := ntohs(pTcpHeader.TCP_Sport);
  368.                   LDestPort := ntohs(pTcpHeader.TCP_Dport);
  369.                   //TcpData:=buf+iIphLen+sizeof(pTcpHeader);
  370.                   //data_size:=iBufSize-iIphLen-sizeof(pTcpHeader);
  371.                   flag:='1';
  372.                 end;
  373.     IPPROTO_UDP :
  374.                 begin
  375.                   CopyMemory(@pUdpHeader,buf+iIphLen,sizeof(pUdpHeader));
  376.                   //LSourcePort := ntohs(pUdpHeader.uh_sport);
  377.                   LDestPort := ntohs(pUdpHeader.uh_dport);
  378.                   //TcpData:=buf+iIphLen+sizeof(pUdpHeader);
  379.                   //data_size:=iBufSize-iIphLen-sizeof(pUdpHeader);
  380.                 end;
  381.     IPPROTO_ICMP :
  382.                 begin
  383.                   CopyMemory(@pIcmpHeader,buf+iIphLen,sizeof(pIcmpHeader));
  384.                   //LSourcePort := pIcmpHeader.i_type;
  385.                   LDestPort := pIcmpHeader.i_code;
  386.                   //TcpData:=buf+iIphLen+sizeof(pIcmpHeader);
  387.                   //data_size:=iBufSize-iIphLen-sizeof(pIcmpHeader);
  388.                 end;
  389.     else 
  390.     begin
  391.       //LSourcePort :=0;
  392.       LDestPort := 0;
  393.       //TcpData:=buf+iIphLen;
  394.       //data_size:=iBufSize-iIphLen;
  395.     end;
  396.   end;
  397.   if StrLIComp(szDestIP,pchar(localIp),9)=0 then
  398.   begin
  399.     direct:='0';
  400.     Proto:=string(szProtocol);
  401.     remoteIP:=string(szSourceIP);
  402.     DestPort:=inttostr(LDestPort);
  403.   end
  404.   else
  405.   begin
  406.     direct:='1';
  407.     Proto:=string(szProtocol);
  408.     remoteIP:=string(szDestIP);
  409.     DestPort:=inttostr(LDestPort);
  410.   end;
  411. /////////////
  412.   //protoType:='NET';
  413.   AllInfo:='8'+direct+'|'+'1'+'|'+proto+'|'+ remoteIP
  414.     +'|'+ DestPort;//+'|'+ data_size;
  415.   if (Assigned(FOnCap)) and (iTTL>0) then
  416.     //FOnCap(dateStr,timeStr,'NET','1',direct,proto,Flag,remoteIP,DestPort,data_size);
  417.     FOnCap(AllInfo);
  418. /////////////
  419. end;
  420. function TCapIp.CheckSockError(iErrorCode:integer):boolean;
  421. begin
  422.   if(iErrorCode=SOCKET_ERROR) then
  423.   begin
  424.     if Assigned(FOnError) then
  425.       FOnError(inttostr(GetLastError)+SysErrorMessage(GetLastError));
  426.     result:=true;
  427.   end
  428.   else
  429.     result:=false;
  430. end;
  431. procedure TCapIp.WndProc(var MsgRec: TMessage);
  432. begin
  433.   with MsgRec do
  434.   if (Msg >=WM_CapIp) and (Msg <= WM_CapIp+high(FActiveIP)) then
  435.     CapIp(msg-WM_CapIp)
  436.   else
  437.     Result := DefWindowProc(Handle, Msg, wParam, lParam);
  438. end;
  439. constructor TCapIp.Create();
  440. begin
  441.   Fpause:=false;
  442.   Finitsocket:=false;
  443.   setlength(Fsocket,0);
  444.   FWindowHandle := XSocketAllocateHWnd(Self);
  445. end;
  446. destructor TCapIp.Destroy;
  447. var 
  448.   i:integer;
  449. begin
  450.   for i:=0 to high(Fsocket) do
  451.     FCloseSocket(Fsocket[i]);
  452.   if self.Finitsocket then
  453.   begin
  454.     FWSACleanup;
  455.     if Fhand_dll <> 0 then
  456.       FreeLibrary(Fhand_dll);
  457.   end;
  458. end;
  459. function TCapIp.init_socket:boolean;//初始化
  460. var
  461.   GInitData:TWSAData;
  462. begin
  463.   result:=true;
  464.   if Finitsocket then
  465.     exit;
  466.   Fhand_dll := LoadLibrary('ws2_32.dll');
  467.   if Fhand_dll = 0 then
  468.   begin
  469.     raise ESocketException.Create('Unable to register ws2_32.dll');
  470.     result:=false;
  471.     exit;
  472.   end;
  473.   @FWSAStartup  := GetProcAddress(Fhand_dll, 'WSAStartup');
  474.   @FOpenSocket :=  GetProcAddress(Fhand_dll, 'socket');
  475.   @FInet_addr :=   GetProcAddress(Fhand_dll, 'inet_addr');
  476.   @Fhtons  :=      GetProcAddress(Fhand_dll, 'htons');
  477.   @FConnect :=     GetProcAddress(Fhand_dll, 'connect');
  478.   @FCloseSocket := GetProcAddress(Fhand_dll, 'closesocket');
  479.   @Fsend        := GetProcAddress(Fhand_dll, 'send');
  480.   @FWSAIoctl := GetProcAddress(Fhand_dll, 'WSAIoctl');
  481.   @Frecv        := GetProcAddress(Fhand_dll, 'recv');
  482.   @FWSACleanup  := GetProcAddress(Fhand_dll, 'WSACleanup');
  483.   @FWSAAsyncSelect:=GetProcAddress(Fhand_dll, 'WSAAsyncSelect');
  484.   if (@FWSAStartup =nil) or(@Fhtons =nil) or (@FConnect =nil) or (@Fsend =nil)
  485.     or (@FWSACleanup=nil) or (@FOpenSocket =nil) or (@FInet_addr =nil)
  486.     or (@FCloseSocket =nil) or (@recv=nil)or (@FWSAIoctl=nil)
  487.     or (@FWSAAsyncSelect=nil) then
  488.   begin
  489.     raise ESocketException.Create('加载dll函数错误!');
  490.     result:=false;
  491.     exit;
  492.   end;
  493.   if FWSAStartup($201,GInitData)<>0 then
  494.   begin
  495.     raise ESocketException.Create('初始化SOCKET2函数失败!');
  496.     result:=false;
  497.     exit;
  498.   end;
  499.   Finitsocket:=true;
  500. end;
  501. procedure TCapIp.StartCap;
  502. begin
  503.   if not Finitsocket then
  504.     if not init_socket then
  505.       exit;
  506.   get_ActiveIP;
  507.   set_socket_state;
  508. end;
  509. procedure  TCapIp.pause;
  510. begin
  511.   if Finitsocket and (high(Fsocket)>-1) then
  512.     Fpause:=not Fpause;
  513. end;
  514. procedure TCapIp.StopCap;
  515. var 
  516.   i:integer;
  517. begin
  518.   for i:=0 to high(Fsocket) do
  519.     FCloseSocket(Fsocket[i]);
  520. end;
  521. end.