⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iggstreamclient.pas

📁 通信控件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    FLoginIP   := PData.dwIP;
    FLoginPort := PData.dwPort;
    FRegister  := PData.dwResult = Ord(TRUE);
  end;
end;

procedure TIClient.DoUnregister();

  procedure UDPUnregister();
  var
    Data: TUnregisterData;
  begin
    FillChar(Data, SizeOf(Data), 0);

    Data.dwID := FSelfID;
    StrLCopy(Data.szNameID, PChar(FNameID), Length(FNameID));
    SendRecMsgProc(0, Data, SizeOf(Data), SB_USER_UNREGIST, RS_USER_UNREGIST);
  end;

begin
  try
    try
      if FRegister then
      begin
        UDPUnregister();
      end;
    except end;
  finally
    FRegister := FALSE;
  end;
end;

procedure TIClient.OnUnRegister(PHeader: PSPKHeader);
var
  PData: PRsUnRegisterData;
begin
  PData := Data(PHeader);
  if (PData.dwID = FSelfID) then
  begin
    //if PData.dwResult = 1 then
    FRegister  := FALSE;
  end;
end;

procedure TIClient.SetOwnerInfo(Info: Pointer; InfoSize: Integer);
var
  H: TIDescribeH;
  Res: Integer;
begin
  if FActive then
  begin
    H.ID := FSelfID;
    StrLCopy(H.NameID, PChar(FNameID), Length(FNameID));
    H.InfoSize := InfoSize;
    Res := TITCPClient.TQuery(H, SizeOf(H), Info, InfoSize, SB_SET_USER_INFO, 0, FServerIP, FServerPort, 0);
  end;
  //if Res > 0 then
    //OnSetOwnerInfoNotify();
end;

function TIClient.GetOwnerInfo(): Pointer;
var
  H: TIDescribeH;
  Res: Integer;
  PPackR: PTCPPackR;
begin
  H.ID := FSelfID;
  StrLCopy(H.NameID, PChar(FNameID), Length(FNameID));
  H.InfoSize := 0;
  New(PPackR); FillChar(PPackR^, SizeOf(TTCPPackR), 0);
  Res := TITCPClient.TQuery(PPackR, H, SizeOf(H), nil, 0, SB_GET_USER_INFO, 0, FServerIP, FServerPort, 0);
  if (Res > 0) and (PPackR.PackSize > 0) and (PPackR.Pack <> nil) then
  begin
    Result := PPackR.Pack;
    //OnGetOwnerInfoNotify();
  end;
end;

function TIClient.GetUserInfo(NameID: string): Pointer;
var
  H: TIDescribeH;
  Res: Integer;
  PPackR: PTCPPackR;
begin
  Result := nil;
  H.ID := CalculateID(NameID);
  StrLCopy(H.NameID, PChar(NameID), Length(NameID));
  H.InfoSize := 0;
  New(PPackR); FillChar(PPackR^, SizeOf(TTCPPackR), 0);
  Res := TITCPClient.TQuery(PPackR, H, SizeOf(H), nil, 0, SB_GET_USER_INFO, 0, FServerIP, FServerPort, 0);
  if (Res > 0) and (PPackR.PackSize > 0) and (PPackR.Pack <> nil) then
  begin
    if (PPackR.PackSize > 0) then
      Result := PChar(PPackR.Pack);
    //OnGetOwnerInfoNotify();
  end;
  dispose(PPackR);
end;

function TIClient.GetNameOfID(ID: DWORD): string;
var
    I: Integer;
begin
    Result := '';
    for I := 0 to FNameStrings.Count-1 do
    begin
      if ID = CalculateID(FNameStrings.Strings[I]) then
      begin
        Result := FNameStrings.Strings[I]; Break;
      end;
    end;
end;

procedure TIClient.DoConnectNotify(AttachID: DWORD; Status: Integer; IP: Integer; Port: Integer);
var
  NameID: string;
begin
  NameID := GetNameOfID(AttachID);
  if (NameID <> '') and Assigned(FOnConnectNotify) then
  begin
    if (Status = 1) then
      StartWaitBuffer(AttachID);
    FOnConnectNotify(NameID, Status, IPToString(IP), Port);
  end;
end;

procedure TIClient.Connect(NameID: string);
var
  AttachID: DWORD;
  IDRoute: TRoute;
begin
  if (NameID = '') then Exit;
  if (FNameStrings.IndexOf(NameID) < 0) then  FNameStrings.Add(NameID);

  AttachID := CalculateID(NameID);
  Connect(AttachID);
end;

procedure TIClient.Disconnect(NameID: string);
var
  AttachID: DWORD;
begin
  if (NameID = '') then Exit;
  if (FNameStrings.IndexOf(NameID) < 0) then  FNameStrings.Add(NameID);
  
  AttachID := CalculateID(NameID);
  Disconnect(AttachID);
end;

procedure TIClient.Disconnect(AttachID: DWORD);
begin
  FRoutePool.Cancel(AttachID);
  DoConnectNotify(AttachID, 0, 0, 0);
end;

function TIClient.GetConnectSyn(AttachID: DWORD; Operator: DWORD): TConnectSyn;
var
  Data: TConnectSyn;
  PPackR: PTCPPackR; Res: Integer;
begin
  FillChar(Data, SizeOf(Data), 0);
  FillChar(Result, SizeOf(Result), 0);
  Data.SelfID := FSelfID;
  Data.AttachID := AttachID;
  Data.Operator := Operator;
  New(PPackR);
  FillChar(PPackR^, SizeOf(TTCPPackR), 0);
  Res := TITCPClient.TQuery(PPackR, Data, SizeOf(Data), nil, 0, SB_GET_UNIQUE_ID, 0, FServerIP, FServerPort, 0);
  if (Res > 0) and (PPackR.PackSize > 0) and (PPackR.Pack <> nil) then
  begin
    Result := PConnectSyn(PPackR.Pack)^;
  end;
  Dispose(PPackR);
end;

function TIClient.Connect(AttachID: DWORD; IsCheckSyn: Boolean): Integer;
var
  Syn: TConnectSyn;
begin
  Result := QueryWorkBuffer(AttachID);

  if Result = 0 then
  begin
    FRoutePool.Cancel(AttachID);
    FRoutePool.Route(AttachID);
  end;
  
  if (IsCheckSyn) then
  begin
    Result := 0;
    
    Syn := GetConnectSyn(AttachID, 1);
    if (Syn.Para1 = 0) then
    begin
      {self UnRegister ....}
      Exit;
    end;

    if (Syn.Para2 = 0) then
    begin
      {Attach UnRegister ....}
      Exit;
    end;

    Result := Syn.Para3;
  end;
end;

function TIClient.PackedInReadBuffer(AttachID: DWORD; SynID: DWORD; Buffer: Pointer; BufferSize: Integer): Integer;
var
  IBuffer: TIBuffer;
begin
  Result := -1;
  try
    IBuffer := TIBuffer.Create(SynID, FSelfID, AttachID, Buffer, BufferSize, FALSE);
    if (IBuffer.Enable) then
    begin
      IBuffer.NameID := GetNameOfID(AttachID);
      IBuffer.Callback := TIBufferCallback;
      Result := FReadBuffers.Add(IBuffer);
      if Result < 0 then
      begin
        FReadBuffers.Remove(IBuffer.ID);
        FReadBuffers.Delete(IBuffer);
      end else begin
        IBuffer.ReadREQ();
      end;
    end;
  except end;
  if Result >= 0 then Result := 0 else Result := -1;
end;

procedure TIClient.SendBuffer(AttachID: Integer; Buffer: Pointer; BufferSize: Integer);
var
  Res: DWORD;
begin
  Res := Connect(AttachID, TRUE);
  if (Res > 0) then
  begin
    Res := PackedInReadBuffer(AttachID, Res, Buffer, BufferSize);
    if (Res <> 0) then
    begin
      DoSendNotify(AttachID, BufferSize, Res);
    end;
  end;
end;

procedure TIClient.SendBuffer(NameID: string; Buffer: Pointer; BufferSize: Integer);
var
  AttachID: DWORD;
begin
  if (not FActive) or ((NameID = '') or (Buffer = nil) or (BufferSize <= 0)) then Exit;
  if (FNameStrings.IndexOf(NameID) < 0) then
    FNameStrings.Add(NameID);

  AttachID := CalculateID(NameID);
  SendBuffer(AttachID, Buffer, BufferSize);
end;

function TIClient.QueryWorkBuffer(AttachID: DWORD; IsRead: Boolean): Integer;
var
  IBuffer: TIBuffer; I: Integer;
begin
  I := 0; Result := 0;
  try
    //if IsRead then
    //begin
      while(TRUE) do
      begin
        IBuffer := FReadBuffers.SearchIn(I);
        if (IBuffer = nil) then Break;
        Result := IBuffer.Work;
        if (IBuffer.AttachID = AttachID) and (Result > 0) then
          Break;
      end;
    //end else begin
      while(Result = 0) do
      begin
        IBuffer := FWriteBuffers.SearchIn(I);
        if (IBuffer = nil) then Break;
        Result := IBuffer.Work;
        if (IBuffer.AttachID = AttachID) and (Result > 0) then
          Break;
      end;
    //end;
  except end;
end;

procedure TIClient.StartWaitBuffer(AttachID: DWORD);
var
  IBuffer: TIBuffer; I, V: Integer;
begin
  I := 0; V := 0;
  try
    while(TRUE) do
    begin
      IBuffer := FReadBuffers.SearchIn(I);
      if (IBuffer = nil) then Break;
      V := IBuffer.Work;
      if (IBuffer.AttachID = AttachID) and (V = 1) then
      begin
        IBuffer.ReadREQ();
      end;
      Inc(I);
    end;
  except end;
end;

procedure TIClient.DoSendNotify(ID: DWORD; SendSize: Integer; ErrCode: Integer);
var
  NameID, ErrString: string;
begin
  try
    NameID := GetNameOfID(ID);
    if (NameID <> '') and Assigned(FOnSendNotify) then
    begin
      ErrString := '';
      case (ErrCode) of
        -1: ErrString := 'Add to read buffer fail!';
        0:  ErrString := '';{ send read complete. }
        1:  ErrString := 'Send read buffer timeout!';
      end;
      FOnSendNotify(NameID, SendSize, ErrString);
    end;
  except end;
end;

procedure TIClient.DoReceiveNotify(ID: DWORD; Buffer: Pointer; BufferSize: Integer; ErrCode: Integer);
var
  NameID: string;
begin
  try
    NameID := GetNameOfID(ID);
    if (NameID <> '') and Assigned(FOnReceiveNotify) then
    begin
      FOnReceiveNotify(NameID, Buffer, BufferSize, ErrCode);
    end;
  except end;  
end;

function TIClient.DoBufferPool(var PTag: TPacketTag; Check: Boolean): Integer;

  procedure CheckReadPool();
  var
    IBuffer: TIBuffer; I, Res, Last: Integer;
  begin
    I := 0;
    try
      while(TRUE)do
      begin
        IBuffer := FReadBuffers.SearchIn(I);
        if (IBuffer = nil) then Break;

        Last := IBuffer.Query(Res);
        if Last = 0 then
        begin
          DoSendNotify(IBuffer.AttachID, IBuffer.DataSize);
        end;

        case (Res) of
          -1:begin
            if Last < 0 then
              DoSendNotify(IBuffer.AttachID, IBuffer.DataSize, 2);
            FReadBuffers.Remove(IBuffer.ID);
            FReadBuffers.Delete(IBuffer);
          end;
          0:;
        end;
        Inc(I);
      end;
    except end;
  end;

  procedure CheckWritePool();
  var
    IBuffer: TIBuffer; I, Res, Last: Integer;
  begin
    I := 0;
    try
      while(TRUE)do
      begin
        IBuffer := FWriteBuffers.SearchIn(I);
        if (IBuffer = nil) then Break;

        Last := IBuffer.Query(Res);
        if Last = 0 then
        begin
          DoReceiveNotify(IBuffer.AttachID, IBuffer.Data, IBuffer.DataSize, 0);
        end;

        case (Res) of
          -1:begin
            if (Last < 0) then
              DoReceiveNotify(IBuffer.AttachID, nil, IBuffer.DataSize, 2);
            FWriteBuffers.Remove(IBuffer.ID);
            FWriteBuffers.Delete(IBuffer);
          end;
          0:;
        end;
        Inc(I);
      end;
    except end;
  end;

  procedure OnWrietBufferRecord(Attr: PIBufferAttr);
  var
    IBuffer: TIBuffer;
  begin
    if Assigned(Attr) then
    begin
      if FWriteBuffers.IndexOf(Attr.ID) < 0 then
      begin
        IBuffer := TIBuffer.Create(Attr.ID, FSelfID, Attr.SelfID, nil, Attr.DataSize);
        if (IBuffer.Enable) then
        begin
          if (FNameStrings.IndexOf(Attr.NameID) < 0) then
            FNameStrings.Add(Attr.NameID);
          IBuffer.NameID := Attr.NameID;
          IBuffer.Callback := TIBufferCallback;
          if FWriteBuffers.Add(IBuffer) < 0 then
          begin
            FWriteBuffers.Remove(IBuffer.ID);
            FWriteBuffers.Delete(IBuffer);
          end else begin
            IBuffer.WriteREQ();
            if Assigned(FOnReceiveNotify) then
              DoReceiveNotify(Attr.SelfID, nil, Attr.DataSize, 1);
          end;
        end;
      end;
    end;
  end;

  procedure OnWriteBufferSEQU(DataSEQU: PIBufferDataSEQU; Data: Pointer);
  var
    IBuffer: TIBuffer;
  begin
    if Assigned(DataSEQU) then
    begin
      IBuffer := FWriteBuffers.Get(DataSEQU.ID);
      if (IBuffer <> nil) then
      begin
        IBuffer.Write(DataSEQU, Data, DataSEQU.ReadSize);
      end;
    end;
  end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -