📄 uditcpcircularpacketsocketserver.pas
字号:
unit uDITcpCircularPacketSocketServer;
interface
uses
Windows, Sysutils, uDIBuffer, uIOCompletionPort, uDIClientContext, uDIProtocol,
uDIIocpTcpServer;
{$I IOCP.inc}
type
TDITcpCircularPacketSocketServer = class(TDIIocpTcpServer)
private
procedure NewSocketEvent(FClientContext: TDIClientContext);
procedure CloseSocketEvent(FClientContext: TDIClientContext);
procedure RecvCompletedEvent( FClientContext: TDIClientContext;
FDIBuffer: TDIBuffer;
dwIoSize: DWORD );
procedure SendCompletedEvent( FClientContext: TDIClientContext;
FDIBuffer: TDIBuffer;
dwIoSize: DWORD );
procedure ProcessDataStream( FClientContext: TDIClientContext;
FDIBuffer: TDIBuffer;
dwIoSize: DWORD );
public
procedure ReadEchoPackage(FDIBuffer: TDIBuffer);
procedure WriteEchoPackage(FDIBuffer: TDIBuffer);
published
procedure AppendDisplayMsg(sMsg: String); override;
procedure AppendLogMessage(sMsg: String); override;
procedure AppendErrorLogMessage(sMsg: String); override;
procedure SendMsgToAll;
public
constructor Create(IOCompletionPort: TIOCompletionPort);
destructor Destroy; override;
end;
implementation
uses crc16, uDIMonitor, uFileLogger;
constructor TDITcpCircularPacketSocketServer.Create(IOCompletionPort: TIOCompletionPort);
begin
inherited Create(IOCompletionPort);
OnNewSocketEvent := NewSocketEvent;
OnCloseSocketEvent := CloseSocketEvent;
OnRecvCompletedEvent := RecvCompletedEvent;
OnSendCompletedEvent := SendCompletedEvent;
end;
destructor TDITcpCircularPacketSocketServer.Destroy;
begin
inherited Destroy;
end;
procedure TDITcpCircularPacketSocketServer.AppendDisplayMsg(sMsg: String);
begin
end;
procedure TDITcpCircularPacketSocketServer.AppendLogMessage(sMsg: String);
begin
_FileLogger.WriteLogMsg(sMsg);
end;
procedure TDITcpCircularPacketSocketServer.AppendErrorLogMessage(sMsg: String);
begin
_FileLogger.WriteLogMsg(sMsg);
end;
procedure TDITcpCircularPacketSocketServer.NewSocketEvent(FClientContext: TDIClientContext);
begin
{$IFDEF _ICOP_DEBUG}
AppendLogMessage('新客户端连接, IP地址:'+FClientContext.FRemoteIP+
' Socket ID: '+ IntToStr(FClientContext.m_KeyID)+
' m_iNumberOfActiveConnections:'+IntToStr(m_iNumberOfActiveConnections));
{$ENDIF}
end;
procedure TDITcpCircularPacketSocketServer.CloseSocketEvent(FClientContext: TDIClientContext);
begin
{
AppendDisplayMsg('客户端关闭, IP地址:'+GetRemoteIPAddr(FClientContext.FRemoteAddr)+
' Socket ID:'+ IntToStr(FClientContext.m_KeyID)); }
end;
procedure TDITcpCircularPacketSocketServer.RecvCompletedEvent( FClientContext: TDIClientContext;
FDIBuffer: TDIBuffer;
dwIoSize: DWORD );
begin
{$IFDEF _IOCP_MONITOR}
_DIMonitor.AddRecvByte(dwIoSize);
{$ENDIF}
//设置socket
FClientContext.FContextLock.Lock;
FDIBuffer.m_Socket := FClientContext.FSocket;
FClientContext.FContextLock.UnLock;
//处理数据
ProcessDataStream(FClientContext, FDIBuffer, dwIoSize);
//投递下一个Buffer
PostWSARecv(FClientContext);
end;
procedure TDITcpCircularPacketSocketServer.SendCompletedEvent( FClientContext: TDIClientContext;
FDIBuffer: TDIBuffer;
dwIoSize: DWORD );
begin
{$IFDEF _IOCP_MONITOR}
_DIMonitor.AddSendByte(dwIoSize);
{$ENDIF}
if FDIBuffer.GetUsed = dwIoSize then begin
// {$IFDEF _ICOP_DEBUG}
// AppendLogMessage('SendCompletedEvent投递完成! Key : '+IntToStr(FClientContext.m_KeyID));
// {$ENDIF}
end
else
begin
{$IFDEF _ICOP_DEBUG}
AppendLogMessage('SendCompletedEvent尚未完成! Key : '+IntToStr(FClientContext.m_KeyID));
{$ENDIF}
end;
end;
procedure TDITcpCircularPacketSocketServer.ProcessDataStream( FClientContext: TDIClientContext;
FDIBuffer: TDIBuffer;
dwIoSize: DWORD );
begin
{
FClientContext.FContextLock.Lock;
//读数据包
ReadEchoPackage(FDIBuffer);
FClientContext.SendBuffer.InitBuffer;
CopyMemory( Pointer(FClientContext.SendBuffer.GetBuffer),
Pointer(FDIBuffer.GetBuffer),
FDIBuffer.GetUsed );
FClientContext.SendBuffer.SetUsed(FDIBuffer.GetUsed);
FClientContext.FContextLock.UnLock;
PostWSASend(FClientContext);
}
end;
procedure TDITcpCircularPacketSocketServer.ReadEchoPackage(FDIBuffer: TDIBuffer);
begin
end;
procedure TDITcpCircularPacketSocketServer.WriteEchoPackage(FDIBuffer: TDIBuffer);
begin
end;
procedure TDITcpCircularPacketSocketServer.SendMsgToAll;
var
m_pFreeClientContext: TDIClientContext;
m_pNextClientContext: TDIClientContext;
begin
FMapClientContextLock.Lock;
//取单链表头
m_pFreeClientContext := FMapClientContext.FClientContextList;
m_pNextClientContext := nil;
while (m_pFreeClientContext<> nil) do begin
m_pNextClientContext := m_pFreeClientContext.m_pNext;
m_pFreeClientContext.FContextLock.Lock;
m_pFreeClientContext.SendBuffer.m_Socket := m_pFreeClientContext.m_Socket;
//WriteEchoPackage(m_pFreeClientContext.SendBuffer);
m_pFreeClientContext.FContextLock.UnLock;
PostWSASend(m_pFreeClientContext);
m_pFreeClientContext := m_pNextClientContext;
end;
FMapClientContextLock.UnLock;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -