📄 msgconnection.pas
字号:
unit MsgConnection;
interface
{$I MsgVer.inc}
{$IFDEF DEBUG_LOG_NETWORK_THREADS}
{DEFINE LOG_CLIENT_THREADS}
{$DEFINE LOG_SERVER_THREADS}
{$ENDIF}
{DEFINE LOGIC_TEST}
{DEFINE CONNECTION_TEST}
{$IFNDEF CONNECTION_TEST}
{DEFINE NETWORK_TEST}
{$ENDIF CONNECTION_TEST}
{$IFNDEF API_NETWORK}
{$IFDEF D6H}
{$DEFINE ProcessMessages} // Needs for Indy only
{$ENDIF D6H}
{$ENDIF API_NETWORK}
uses
Classes, Math, SysUtils,
{$IFDEF MSWINDOWS}
Windows,
Forms,
{$ENDIF}
{$IFDEF LINUX}
Libc,
QForms,
{$ENDIF}
{$IFNDEF API_NETWORK}
{$IFDEF D6H}
IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdUDPServer, IdSocketHandle,
{$ELSE}
NMUDP,
{$ENDIF}
{$ELSE}
// MsgCommunicator units
MsgNetwork,
MsgCrypto,
{$ENDIF}
{$IFDEF DEBUG_LOG}
MsgDebug,
{$ENDIF}
MsgCompression,
MsgComBase,
MsgTypes,
MsgConst,
MsgExcept,
MsgLinux,
MsgCriticalSection,
MsgBaseEngine,
MsgMemory;
const
{******************************************************************************}
// ControlCode (-128..127):
{******************************************************************************}
// From Client
MsgNewRequest = 10; // 10...32 -- reserwed for MsgCommunicator commands
// 33...63 -- reserwed for custom commands
MsgConnect = 1;
// From Server
MsgConnected = 2;
// Both
MsgNoAction = 0;
MsgMessage = 3;
// MsgLastPacket: 7th bit = 1, i.e. byte = x1xxxxxx, i.e. code >= 64
MsgLastPacket = 64;
MsgEcho = 4;
MsgTunning = 5;
MsgServerSessionTunning = 6;
MsgPing = 7;
MsgLogon = 8;
MsgLogoff = 9;
// single packet:
MsgAllPacketsReceived = -1;
MsgPacketResendRequest = -2;
MsgMessageReceived = -3;
MsgMessagePacketResendRequest = -4;
MsgDisconnect = -55;
{$IFDEF MsgCommunicator}
// Both
MsgGetUserInfo = 10;
MsgRegisterNewUser = 11;
MsgAddUserToContacts = 12;
MsgRemoveUserFromContacts = 13;
MsgGetContacts = 14;
MsgUpdateUserInfo = 15;
MsgGetUserID = 16;
MsgFindUsers = 17;
MsgFindMessages = 18;
MsgIsUserExisting = 19;
MsgIsUserOnline = 20;
MsgUpdateUserInContacts = 21;
{$ENDIF}
{******************************************************************************}
{******************************************************************************}
// Sending Status - Fof Commands and Messages
{******************************************************************************}
MsgNotSent = 0;
MsgSent = -1;
{******************************************************************************}
{******************************************************************************}
// Receiving Status
{******************************************************************************}
MsgNo = 0;
MsgStart = 1;
MsgNotFull = 2;
MsgFull = -1;
{******************************************************************************}
{******************************************************************************}
// Session Control Codes
{******************************************************************************}
MsgExecute = 0;
MsgSuspend = 1;
MsgTerminate = -1;
{******************************************************************************}
{******************************************************************************}
// Session Status
{******************************************************************************}
MsgVacant = 0;
MsgInUse = -1;
{******************************************************************************}
MsgNoResending = 999;
{******************************************************************************}
////////////////////////////////////////////////////////////////////////////////
// Error Codes
////////////////////////////////////////////////////////////////////////////////
{******************************************************************************}
// location
{******************************************************************************}
// client
MsgClientListenerThread = 70;
MsgClientResendRequestThread = 71;
MsgClientMsgResendRequestThread = 72;
MsgClientConnectionManager = 79;
// server
MsgServerListenerThread = 80;
MsgServerResendRequestThread = 81;
MsgServerMsgResendRequestThread = 82;
MsgServerSessionThread = 83;
MsgServerSessionMsgThread = 84;
MsgServerSessionDisconnectThread = 85;
MsgServerSessionTerminatorThread = 86;
MsgServerPingClientsThread = 87;
MsgServerTerminateCommandThreads = 90;
MsgServerTerminateMessageThreads = 91;
MsgServerDeleteSession = 92;
MsgServerConnectionManager = 99;
{******************************************************************************}
// functions
{******************************************************************************}
// client
MsgClntEchoRecv = 1;
MsgClntEchoSend = 2;
MsgClntEchoDND = 3;
MsgClntRecvDND = 4;
MsgClntMsgDND = 5;
// server
MsgSrvrRecv = 31;
MsgSrvrRecvDND = 32;
MsgSrvrEchoSend = 33;
MsgSrvrEchoDND = 34;
MsgSrvrMsgRecv = 35;
MsgSrvrMsgDND = 36;
////////////////////////////////////////////////////////////////////////////////
// To avoid multiple realloc
////////////////////////////////////////////////////////////////////////////////
MsgDefaultPacketsInAnswer = 8;
MsgDefaultPacketsInRequest = 2;
MsgDefaultMsgPacketsInAnswer = 1;
MsgDefaultMsgPacketsInRequest = 1;
// Signatures
{$IFDEF MsgCommunicator}
MsgClientPacketSign = 'MCR1';
MsgServerPacketSign = 'MCR2';
{$ELSE}
MsgClientPacketSign = 'ADB1';
MsgServerPacketSign = 'ADB2';
{$ENDIF}
type
PThread = ^TThread;
TMsgSessionsArray = array of TMsgComBaseSession;
TMsgNetwork = class;
TMsgBaseConnectionManager = class;
{$IFDEF CLIENT_VERSION}
TMsgClientConnectionManager = class;
TMsgClientResendRequestThread = class;
TMsgClientMsgResendRequestThread = class;
{$ENDIF}
{$IFDEF SERVER_VERSION}
TMsgServerConnectionManager = class;
TMsgServerSessionThread = class;
TMsgServerSessionMsgThread = class;
TMsgServerSessionDisconnectThread = class;
TMsgServerResendRequestThread = class;
TMsgServerMsgResendRequestThread = class;
{$ENDIF}
TMsgControlCode = ShortInt;
TMsgNetworkClientID = Integer;
TMsgConnectionID = Integer;
TMsgPacketHeader = packed record
CheckSum: Cardinal;
Signature: array [0..3] of Char;
Recepient: TMsgNetworkClientID;
Sender: TMsgNetworkClientID;
ConnectionID: TMsgConnectionID;
SessionID: TMsgSessionID;
CurrentRequestID: Integer;
PacketID: Integer;
ControlCode: TMsgControlCode;
end;
PMsgPacketHeader = ^TMsgPacketHeader;
TMsgPacket = packed record
Buffer: PChar;
BufferSize: Integer;
end;
PMsgPacket = ^TMsgPacket;
TMsgConnectionParams = packed record
PacketSize: Integer;
CompressionAlgorithm: Byte;
CompressionMode: Byte;
end;
PMsgConnectionParams = ^TMsgConnectionParams;
{$IFDEF CLIENT_VERSION}
TMsgClntSession = packed record
Session: TMsgComBaseSession;
ServerSessionID: TMsgSessionID;
CurrentRequestID: Integer;
Packets: TList;
ListeningThreads: TThreadList;
MsgListeningThreads: TThreadList;
ResendRequestThread: TMsgClientResendRequestThread;
MsgResendRequestThread: TMsgClientMsgResendRequestThread;
AnswerStatus: Integer;
SendStatus: Integer;
PacketIDsToResend: TMsgIntegerArray;
ClientMessageID: Integer;
ServerMessageID: Integer;
MsgPackets: TList;
MsgPacketIDsToResend: TMsgIntegerArray;
MsgSendStatus: Integer;
MsgReceiveStatus: Integer;
ConnectionID: TMsgConnectionID;
RemoteConnectionID: TMsgConnectionID;
ControlCode: Shortint;
MsgControlCode: Shortint;
Status: Shortint;
AnswerTime: DWORD;
LiveListenerThreads: Integer;
end;
PMsgClntSession = ^TMsgClntSession;
TMsgClntConnection = packed record
ConnectionID: TMsgConnectionID;
Network: TMsgNetwork;
end;
PMsgClntConnection = ^TMsgClntConnection;
{$ENDIF}
{$IFDEF SERVER_VERSION}
TMsgSrvrSession = packed record
Session: TMsgComBaseSession;
CurrentRequestID: Integer;
Packets: TThreadList;
ReceiveStatus: Shortint; // for ReceiveBuffer
SendStatus: Shortint; // for SendBuffer
MsgReceiveStatus: Shortint;
MsgSendStatus: Shortint;
PacketIDsToResend: TMsgThreadIntArray;
ClientMessageID: Integer;
ServerMessageID: Integer;
MsgPackets: TThreadList;
MsgPacketIDsToResend: TMsgThreadIntArray;
ClientSessionID: TMsgSessionID;
ConnectionID: TMsgConnectionID;
RemoteClientID: TMsgNetworkClientID;
RemoteHost: String;
RemotePort: Integer;
Application: String;
ListeningThreads: TThreadList;
MsgListeningThreads: TThreadList;
Thread: TMsgServerSessionThread;
MsgThread: TMsgServerSessionMsgThread;
DisconnectThread: TMsgServerSessionDisconnectThread;
ControlCode: Shortint;
MsgControlCode: Shortint;
Status: Shortint;
Connected: Boolean; // used in Ping thread to avoid sending to non-specified remote address
AnswerTime: DWORD;
LastSendPingTime: DWORD;
LastReceivePingTime: DWORD;
end;
PMsgSrvrSession = ^TMsgSrvrSession;
{$ENDIF}
////////////////////////////////////////////////////////////////////////////////
//
// TMsgNetwork
//
////////////////////////////////////////////////////////////////////////////////
TMsgNetwork = class (TObject)
private
FManager: TMsgBaseConnectionManager;
FLocalClient: TMsgNetworkClientID;
{$IFNDEF API_NETWORK}
FLocalHost: String;
FRemoteHost: String;
FRemotePort: Integer;
{$ENDIF API_NETWORK}
function RndClientID: TMsgNetworkClientID;
procedure SetRemoteHost(Host: String);
function GetRemoteHost: String;
procedure SetRemotePort(Port: Integer);
function GetRemotePort: Integer;
procedure SetLocalHost(Host: String);
function GetLocalHost: String;
procedure SetLocalPort(Port: Integer);
function GetLocalPort: Integer;
public
{$IFDEF API_NETWORK}
FMsgNetwork: TMsgapiNetwork;
{$ELSE}
{$IFDEF D6H}
// FNetworkClient: TIdUDPClient;
FNetworkServer: TIdUDPServer;
{$ELSE}
FTransport: TNMUDP;
{$ENDIF}
{$ENDIF}
protected
procedure CreateNetwork;
procedure FreeNetwork;
procedure ReCreateNetwork;
public
constructor Create(ConnectionManager: TMsgBaseConnectionManager);
destructor Destroy; override;
procedure SendBuffer(
Buffer: PChar;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -