所以我有这个应用程序来验证用户是否可以登录。
它由多个客户端(最多 200 个)和一个处理登录查询(包含用户名、密码和 IP)的服务器组成。服务器检查用户是否存在并返回答案。
TLoginQuery 是一条记录。
procedure TLogin_Form.btnLoginClick(Sender: TObject);
var LoginQuery1: TLoginQuery;
begin
if not LoginSocket.Active then
begin
LoginSocket.Open;
end;
//Paketchen schnüren.
LoginQuery1.Name := ledtName.Text;
LoginQuery1.Passwort := ledtPasswort.Text;
LoginQuery1.IP := LoginSocket.Socket.LocalAddress;
//LoginQuery ín den Socket legen.
LoginSocket.Socket.SendBuf(LoginQuery1, SizeOf(LoginQuery1));
end;
服务器当前读取:
procedure TServer_Form.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var LoginQuery: TLoginQuery;
uservalid: boolean;
begin
uservalid := false;
Socket.ReceiveBuf(LoginQuery, SizeOf(LoginQuery));
if CheckIfUserValid(LoginQuery) then
begin
uservalid := true;
ServerSocket.Socket.SendBuf(uservalid, SizeOf(uservalid));
end;
end;
现在的问题是: 服务器(通常应该如此)是否为每个客户端创建不同的套接字连接?
我的假设:
ClientA 发送其登录数据并从服务器接收 uservalid bool 值(上面的代码)。当 uservalid bool 值被写入套接字连接时,会发生以下情况: 就在 ClientA 可以获取 uservalid bool 值(应该如此)之前,已经登录的 ClientB 从套接字读取并获取(因为不应该如此)用户有效 bool 值。
这可以通过每个客户端使用一个套接字来干预。对吗?
最佳答案
TServerSocket.OnClientRead 的 Socket:TCustomWinSocket 参数仅代表客户端之一与服务器之间的一个连接。因此,当客户端 Foo 发送登录记录并调用 TServer_Form.ServerSocketClientRead 时,只需说
if CheckIfUserValid(LoginQuery) then
begin
uservalid := true;
Socket.SendBuf(uservalid, SizeOf(uservalid));
end;
您将把数据发送给正确的客户端。
关于delphi - TServerSocket : Confusion with Socket Objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1164300/