📄 udisocketsecurityconn.pas
字号:
unit uDISocketSecurityConn;
interface
uses
Windows, Classes, Sysutils, WinSock2, uCriticalSection;
{$I IOCP.inc}
type
PTSocketSecurityConn = ^TSocketSecurityConn;
TSocketSecurityConn = packed record
m_Socket: TSocket; //套接字
IsAllowConn: Boolean; //允许连接
FRemoteAddr: PSockAddr; //PSockAddr
sRemoteIPAddr: array [0..14] of Char; //IP地址
end;
TDISocketSecurityConn = Class
protected
m_bOneIPPerConnection: Boolean; //IP限制标志
m_BanIPList: TList; //黑名单列表
m_BanIPListLock: TCriticalSection; //锁
m_OneIPPerConnList: TList; //IP列表
m_OneIPPerConnListLock: TCriticalSection; //锁
public
//设置是否一个IP只允许一个连接
procedure SetOneIPPerConnection(bAllow: Boolean);
function IsAlreadyConnected(FRemoteAddr: PSockAddr): Boolean;
function IsInBannedList(FRemoteAddr: PSockAddr): Boolean;
public
constructor Create;
destructor Destroy; override;
end;
implementation
//TDISocketSecurityConn
constructor TDISocketSecurityConn.Create;
begin
inherited Create;
m_bOneIPPerConnection := FALSE;
end;
destructor TDISocketSecurityConn.Destroy;
begin
inherited Destroy;
end;
procedure TDISocketSecurityConn.SetOneIPPerConnection(bAllow: Boolean);
begin
m_bOneIPPerConnection := bAllow;
end;
function TDISocketSecurityConn.IsAlreadyConnected(FRemoteAddr: PSockAddr): Boolean;
begin
if not m_bOneIPPerConnection then Result := FALSE;
{
void* pVoid=(void*)pCaller->sin_addr.S_un.S_addr;
m_OneIPPerConnectionLock.Lock();
POSITION pos=m_OneIPPerConnectionList.Find(pVoid);
// If it is in the list return TRUE else add it to the list..
if ( pos!=NULL )
m_OneIPPerConnectionLock.Unlock();
return TRUE;
else
m_OneIPPerConnectionList.AddHead(pVoid);
m_OneIPPerConnectionLock.Unlock();
return FALSE; }
end;
function TDISocketSecurityConn.IsInBannedList(FRemoteAddr: PSockAddr): Boolean;
begin
// m_bOneIPPerConnection := bAllow;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -