码迷,mamicode.com
首页 > 其他好文 > 详细

DIOCP之DEMO-登陆验证设计

时间:2016-09-02 21:38:50      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

登陆设计原理:

(一)client在与服务器建立连接后向服务器发送含有"USER=XXXXX&PWD=XXXXX"或者用JSON字符串。

   client的代码需要写在OnContextConnected事件中,注{"cmd":"login","User":"admin","Pwd":"admin888"}

(二)服务器收到客户端传来的命令串后,首先判断命令是不是login,查询USER是否在登陆列表或内存表或stringlist中,如果不在则查询数据库验证USER与PWD,正确后写入到登陆列表或内存表或stringlist,返回给客户验证结果,发送完成后关闭当前连接

 {"cmd":"login","result":"OK"} 
{"cmd":"login","result":"error"}

server的代码需要写在OnRecvBuffer事件中

 

 

备注:

Echoserver

procedure TfrmMain.OnRecvBuffer(pvClientContext:TIocpClientContext;
buf:Pointer; len:cardinal; errCode:Integer);
var
j, i:Integer;
s:AnsiString;
lvBuff:PByte;
lvFileWriter:TSingleFileWriter;
begin
if FChkShowInMemo then
begin
// 如果客户端发送的为字符串,可以用下面代码进行显示
SetLength(s, len);
Move(buf^, s[1], len);
sfLogger.logMessage(s);
if s=‘stu=admin&pwd=admin123‘ then
begin


pvClientContext.PostWSASendRequest(PAnsiChar(‘Sucess‘), Length(‘Sucess‘));
end
else
begin
pvClientContext.PostWSASendRequest(PAnsiChar(‘error‘), Length(‘error‘));//返加错误的登陆信息
pvClientContext.DoDisconnect;//关闭当前连接
end;


end;
if FChkEcho then
begin
if FChkUseBufferPool then
begin

lvBuff := GetBuffer(FPool);

Move(buf^, lvBuff^, len);

//
AddRef(lvBuff);


pvClientContext.PostWSASendRequest(lvBuff, len, dtNone, 1);
end else
begin
pvClientContext.PostWSASendRequest(buf, len);
end;
end;

if FChkShowInMemo then
begin
lvFileWriter := TSingleFileWriter(pvClientContext.Data);
if lvFileWriter = nil then
begin
lvFileWriter := TSingleFileWriter.Create;
pvClientContext.Data := lvFileWriter;
lvFileWriter.FilePreFix := Format(‘RECV_%d‘, [pvClientContext.SocketHandle]);
lvFileWriter.FilePerSize := 1024 * 1024 * 100;
end;

lvFileWriter.WriteBuffer(buf, len);
end;
end;

 

EchoClient:

procedure TfrmMain.OnContextConnected(pvContext: TDiocpCustomContext);
var
s:AnsiString;
begin

TEchoContext(pvContext).FStartTime := Now();
TEchoContext(pvContext).FLastTick := GetTickCount;
TEchoContext(pvContext).FMaxTick := 0;

s := mmoOnConnected.Lines.Text;
if FSendDataOnConnected then
begin
DoSend(pvContext, edt1.Text);//连接后发送数据edt1.text里面为需要向服务器验证的信息
end;

end;

本次没有用到数据库表,原理通了,其余的就简单了 

DIOCP之DEMO-登陆验证设计

标签:

原文地址:http://www.cnblogs.com/diocp/p/5835603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!