📄 msgconnection.pas
字号:
procedure DeleteSession(ServerSession: PMsgSrvrSession;
SkipServerSessionTermination: Boolean = False);
procedure DoDisconnect(Session: TMsgComBaseSession;
SkipServerSessionTermination: Boolean = False);
procedure DoSendBuffer(
ServerSession: PMsgSrvrSession;
Buffer: PChar;
BufferSize: Integer;
Code: Integer = MsgNoAction
);
procedure SendDisconnectRequest(ServerSession: PMsgSrvrSession;
WaitForAnswer: Boolean = True);
procedure SendConnectAckn(
ServerSession: PMsgSrvrSession;
CurrentRequestID: Integer = -1
);
procedure SendPing(ServerSession: PMsgSrvrSession);
procedure SendAcknowledgement(
ServerSession: PMsgSrvrSession;
Msg: Boolean = False;
CurrentRequestID: Integer = -1
);
procedure OnDisconnect(
FNetwork: TMsgNetwork;
FromHost: String;
FromPort: Integer
); override;
procedure NetworkListener(
Buffer: PChar;
BufferSize: Integer;
Network: TMsgNetwork;
FromHost: String;
FromPort: Integer
); override;
procedure WaitForServerSessionThread(
ServerSession: PMsgSrvrSession;
TimeOut: DWORD = MsgWaitForServerSessionThreadTimeOut
);
procedure WaitForServerSessionMsgThread(
ServerSession: PMsgSrvrSession;
TimeOut: DWORD = MsgWaitForServerSessionThreadTimeOut
);
procedure CommandReceived(
ServerSession: PMsgSrvrSession;
ControlCode: TMsgControlCode;
CurrentRequestID: Integer
);
procedure MessageReceived(
ServerSession: PMsgSrvrSession;
ControlCode: TMsgControlCode = MsgMessage
);
// if authorization buffer is valid (encrypted by the same crypto settings as in CryptoInfo)
// then return true else return false
function IsAuthorizationBufferValid(
CryptoInfo: TMsgCryptoInfo;
Buffer: PChar;
BufferSize: Integer
): Boolean;
public
constructor Create(Server: TComponent);
destructor Destroy; override;
procedure Disconnect(Session: TMsgComBaseSession);
procedure DisconnectAll(WaitForAllDisconected: Boolean = True);
procedure SendBuffer(
Session: TMsgComBaseSession;
Buffer: PChar;
BufferSize: Integer;
Code: Integer = MsgNoAction
);
procedure ReceiveBuffer(
ServerSession: PMsgSrvrSession;
var Buffer: PChar;
var BufferSize: Integer
);
procedure SendMessage(
Session: TMsgComBaseSession;
Buffer: PChar;
BufferSize: Integer
);
procedure ReceiveMessage(
ServerSession: PMsgSrvrSession;
var Buffer: PChar;
var BufferSize: Integer
);
function GetClientInfo(
Session: TMsgComBaseSession;
var Host: String;
var Port: Integer;
var Application: String
): Boolean;
// fill array with server session object connected to this server
procedure GetClientsList(var Clients: TMsgSessionsArray);
procedure TerminateSession(Session: TMsgComBaseSession);
end; // TMsgClientConnectionManager
////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerSessionThread
//
////////////////////////////////////////////////////////////////////////////////
TMsgServerSessionThread = class(TThread)
private
FServerSession: PMsgSrvrSession;
FManager: TMsgServerConnectionManager;
FCode: TMsgControlCode;
Error: String;
protected
procedure Execute; override;
public
constructor Create(
Manager: TMsgServerConnectionManager;
ServerSession: PMsgSrvrSession;
Code: Integer = MsgNoAction
);
destructor Destroy; override;
public
end;// TMsgServerSessionThread
////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerSessionMsgThread
//
////////////////////////////////////////////////////////////////////////////////
TMsgServerSessionMsgThread = class(TThread)
private
FServerSession: PMsgSrvrSession;
FManager: TMsgServerConnectionManager;
FCode: TMsgControlCode;
Error: String;
protected
procedure Execute; override;
public
constructor Create(
Manager: TMsgServerConnectionManager;
ServerSession: PMsgSrvrSession;
Code: Integer = MsgNoAction
);
destructor Destroy; override;
public
end;// TMsgServerSessionMsgThread
////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerSessionDisconnectThread
//
////////////////////////////////////////////////////////////////////////////////
TMsgServerSessionDisconnectThread = class(TThread)
private
FServerSession: PMsgSrvrSession;
FManager: TMsgServerConnectionManager;
FCurrentRequestID: Integer;
Error: String;
protected
procedure Execute; override;
public
constructor Create(
Manager: TMsgServerConnectionManager;
ServerSession: PMsgSrvrSession;
CurrentRequestID: Integer = -1
);
destructor Destroy; override;
public
end;// TMsgServerSessionDisconnectThread
////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerListenerThread
//
////////////////////////////////////////////////////////////////////////////////
TMsgServerListenerThread = class(TThread)
private
FManager: TMsgServerConnectionManager;
Buffer: PChar;
BufferSize: Integer;
FromHost: String;
FromPort: Integer;
ServerSession: PMsgSrvrSession;
SessionFound: Boolean;
Error: String;
protected
procedure Execute; override;
public
constructor Create(
Manager: TMsgServerConnectionManager;
Buffer: PChar;
BufferSize: Integer;
FromHost: String;
FromPort: Integer
);
destructor Destroy; override;
end;// TMsgServerListenerThread
////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerResendRequestThread
//
////////////////////////////////////////////////////////////////////////////////
TMsgServerResendRequestThread = class(TThread)
private
FManager: TMsgServerConnectionManager;
Error: String;
protected
procedure Execute; override;
public
constructor Create(
Manager: TMsgServerConnectionManager
);
destructor Destroy; override;
end;// TMsgServerResendRequestThread
////////////////////////////////////////////////////////////////////////////////
//
// TMsgServerMsgResendRequestThread
//
////////////////////////////////////////////////////////////////////////////////
TMsgServerMsgResendRequestThread = class(TThread)
private
FManager: TMsgServerConnectionManager;
Error: String;
protected
procedure Execute; override;
public
constructor Create(
Manager: TMsgServerConnectionManager
);
destructor Destroy; override;
end;// TMsgServerMsgResendRequestThread
{$ENDIF} // Server
////////////////////////////////////////////////////////////////////////////////
//
// Procedures and Functions
//
////////////////////////////////////////////////////////////////////////////////
function CheckSum(Buffer: PChar; BufferSize: Integer): Cardinal;
{$IFNDEF MsgCommunicator}
{IFDEF SERVER_VERSION}
{$ENDIF MsgCommunicator}
function fnIsAuthorizationBufferValid(
CryptoInfo: TMsgCryptoInfo;
Buffer: PChar;
BufferSize: Integer
): Boolean;
{$IFNDEF MsgCommunicator}
{ENDIF SERVER_VERSION}
{$ENDIF MsgCommunicator}
implementation
uses
{$IFDEF SERVER_VERSION}
MsgServer,
{$ENDIF}
{IFDEF MsgCommunicator}
{$IFDEF CLIENT_VERSION}
MsgClient,
{$ENDIF}
{ENDIF}
{$IFNDEF MsgCommunicator}
MsgCommunication,
{$ENDIF}
MsgComMain;
////////////////////////////////////////////////////////////////////////////////
// CheckSum
////////////////////////////////////////////////////////////////////////////////
function CheckSum(Buffer: PChar; BufferSize: Integer): Cardinal;
begin
// Start Point = Pointer(Buffer)+4
// Count (in Bytes) = BufferSize-4
Result := CRC32(555, PChar(Buffer+4), BufferSize-4);
end;
////////////////////////////////////////////////////////////////////////////////
//
// TMsgNetwork
//
////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
// CreateNetwork
//------------------------------------------------------------------------------
procedure TMsgNetwork.CreateNetwork;
begin
{$IFDEF API_NETWORK}
FMsgNetwork := TMsgapiNetwork.Create;
FMsgNetwork.OnDataReceived := OnDataReceived;
FMsgNetwork.OnDisconnect := OnDisconnect;
{$ELSE}
{$IFDEF D6H}
// FNetworkClient := TIdUDPClient.Create(nil);
FNetworkServer := TIdUDPServer.Create(nil);
FNetworkServer.OnUDPRead := OnDataReceived;
{$ELSE}
FTransport := TNMUDP.Create(nil);
FTransport.OnDataReceived := OnDataReceived;
{$ENDIF D6H}
{$ENDIF API_NETWORK}
end; // CreateNetwork
//------------------------------------------------------------------------------
// FreeNetwork
//------------------------------------------------------------------------------
procedure TMsgNetwork.FreeNetwork;
begin
{$IFDEF API_NETWORK}
if FMsgNetwork <> nil then
FMsgNetwork.Free;
FMsgNetwork := nil;
{$ELSE}
{$IFDEF D6H}
// FNetworkClient.Free;
FNetworkServer.Free;
{$ELSE}
FTransport.Free;
{$ENDIF D6H}
{$ENDIF}
end; // FreeNetwork
//------------------------------------------------------------------------------
// ReCreateNetwork
//------------------------------------------------------------------------------
procedure TMsgNetwork.ReCreateNetwork;
var
lRemoteHost: String;
lLocalHost: String;
lRemotePort: Integer;
lLocalPort: Integer;
begin
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> START');
{$ENDIF}
EnterCriticalSection(FManager.FCSect);
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> CS entered');
{$ENDIF}
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> RemoteHost="'+RemoteHost+'"');
{$ENDIF}
lRemoteHost := RemoteHost;
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> RemotePort='+IntToStr(RemotePort));
{$ENDIF}
lRemotePort := RemotePort;
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> LocalHost="'+LocalHost+'"');
{$ENDIF}
lLocalHost := LocalHost;
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> LocalPort='+IntToStr(LocalPort));
{$ENDIF}
lLocalPort := LocalPort;
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> Free...');
{$ENDIF}
FreeNetwork;
{$IFDEF DEBUG_LOG_NETWORK_ONDISCONNECT}
aaWriteToLog('MsgConnection> TMsgNetwork.ReCreateNetwork> Create...');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -