anchor.diff:    FSessions := TDHashTableSafe.Create;
     FSessionClass := TDiocpUdpSession;
   
  +
     FSendRequestPool := TSafeQueue.Create;
  +
  +  // ĬϵDiocp
  +  StartDiocpEngine;
  +  FOwnerEngine := False;
  +
  +  BindDiocpEngine(__defaultDiocpEngine, False);
   end;
   
   destructor TDiocpUdp.Destroy;
   begin
     Stop();
     FDefaultListener.Free;
  -  FreeAndNil(FIocpEngine);
     FSessions.FreeAllDataAsObject;
     FSessions.Free;
   
     FSendRequestPool.FreeDataObject;
     FSendRequestPool.Free;
     inherited Destroy;
  +end;
  +
  +procedure TDiocpUdp.BindDiocpEngine(const pvEngine: TIocpEngine; pvOwner:
  +    Boolean = true);
  +begin
  +  CheckDoDestroyEngine;
  +    
  +  FIocpEngine := pvEngine;
  +  FOwnerEngine := pvOwner;
  +end;
  +
  +procedure TDiocpUdp.CheckDoDestroyEngine;
  +begin
  +  if FOwnerEngine then
  +  begin
  +    if FIocpEngine <> nil then
  +    begin
  +      if not FIocpEngine.StopWorkers(10000) then
  +      begin        // record info
  +        SafeWriteFileMsg('EngineWorkerInfo:' +
  +           sLineBreak + FIocpEngine.GetStateINfo, Self.Name + '_SafeStopTimeOut');
  +      end;
  +      FIocpEngine.SafeStop();
  +      FIocpEngine.Free;
  +      FIocpEngine := nil;
  +    end;
  +    FOwnerEngine := False;
  +  end;
   end;
   
   procedure TDiocpUdp.DoRecv(pvRequest:TDiocpUdpRecvRequest);
  
positive.code: 
      FSendRequestPool: TSafeQueue;
  
      /// <summary>
      ///   ¼
      /// </summary>
  
negative.code: 
  procedure TDiocpUdp.Stop;
  begin
    if FActive then
    begin
      if FIocpEngine.WorkingCount = 0 then
      begin
        Assert(False);
      end;
      FDefaultListener.Stop();
  
      /// лر״̬
      FActive := false;
    end;
  //  FActive := False;
  //  FDefaultListener.Stop();
  //  FIocpEngine.SafeStop();
  end;
  
  function TDiocpUdp.WSASendTo(const ToAddr: TSockAddrIn; buf: Pointer; len:
  