delphi - TServerSocket : Confusion with Socket Objects

标签 delphi sockets client-server

所以我有这个应用程序来验证用户是否可以登录。

它由多个客户端(最多 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/

相关文章:

delphi xe7 使用其余客户端上传/下载保管箱文件并显示进度

德尔福 10.1 柏林 : SOAP Abstract Error

java - 为什么找不到getInputStream?

sockets - 父子进程,socket关闭

c++ - 内存泄漏 - 套接字或字符串相关?

java - 尝试设置简单的客户端服务器系统时连接被拒绝

delphi - 创造 *。 Mht 文件(网络存档)

Delphi (DataSnap) 我需要验证线程吗?

java - 为什么服务器没有收到客户端发送的对象?

java - 在 weblogic 中使用 Jersey 接收到对 RestFul web 服务方法的重复调用