📄 iggstreamclient.pas
字号:
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 + -