限制SocketConnection的用户数

时间:2022-05-30 23:55:33
最近开发了一个用Delphi自带的
Socket做代理服务器的三层结构程序,
现在想控制客户端访问的用户数,
想请教各位有什么办法没有?

19 个解决方案

#1


这个验证放到应用层吧!!客户端连接后,应用层判断连接数量,大于就杀死这个客户端连接时创建的应用层的线程。

#2


To Erice:
能详细说明下么,应用层怎么判断连接数,还有怎么杀死这个客户端连接时创建的应用层的线程。

#3


这东西不复杂,修改ScktSrvr的源代码,把里面的一段

procedure TSocketDispatcher.GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  if Self.Socket.ActiveConnections <= 100 then  // 增加这句,100表示连接上限
    SocketThread := TSocketDispatcherThread.Create(False, ClientSocket,
      InterceptGUID, Timeout, SocketForm.RegisteredAction.Checked, SocketForm.AllowXML.Checked);
end;

#4


在ScktComp的TServerWinSocket.Accept 中加入  
if Self.ActiveConnections <= 10 then 
begin
...
end;
的限制。

#5


To: pazee(耙子)(灵感点亮生活)
谢谢你的指点,我试了一下,你的方法可以控制连接数。
但是当超过连接数的时候,客户端却不停的去连接而又连接不上,
给客户看起来好象是系统Down机的感觉。
能不能在客户连接的时候,给客户端'连接数已满'等提示

#6


在应用层写入:
function TServer.login(const client_no: WideString;): OleVariant;
var
  flag:integer;
begin 
  flag:=2;//
  if clientnumber>=100 then
  begin
    flag:=1;
    self.Destroy;
  end;
  result:=flag;
end;

客户端就调用应用层的程序,根据返回状态来启动或关闭程序

#7


在ScktComp的TServerWinSocket.Accept 中加入  
if Self.ActiveConnections <= 10 then 
begin
...
end
else
begin
  ShowMessage('连接数已满');
end;
的限制。

#8


当然上面的ShowMessage('连接数已满');
只是一个代表,在ScktComp中,你还可以找到ClientSocket在相应的Connect中加入条件限制即可。

#9


楼上的楼上的想法纯粹胡闹,这个限制是在服务器端的,你蹦出来“连接已满”给谁看的?



你的这个要求实现有些困难。这个应该需要服务器端客户端配合才行。

服务器端负责计数、通知客户端“连接已满”并断开连接。

客户端,如果得到连接已满的信息,则不在立即重试。

不过实现起来不简单。

#10


pazee(耙子)(灵感点亮生活) 对啊
应该需要服务器端客户端配合才行。

--------------------
应该让和客户端约定收到什么数据表示什么意思
服务器端达到最大连接后给客户端发送特定的数据

#11


pazee(耙子)(灵感点亮生活)用点脑筋想好不好!如果搂主的程序服务器和客户端配合是能解决限制搂主客户端的连接数,但不能达到真正限制连接数的初衷,若你再编写一个客户端一样可以连接上搂主的服务器。
应当在服务器端加以限制,客户端不可以作指望的。当服务器端拒绝连接时,客户端只能弹出不能连接服务器的对话框,现在大多数应用都是这么做的。

#12


楼上的恼了?

你没仔细看我的话,我说的配合是服务器通知客户端不能连接的原因,让客户端能得到原因,这就达到楼主的目的。
楼主想知道不能连接的原因。

断开当然是在服务器上作的,这个从始至总都是这么说的。

你写一百个同样的客户端也是连不上的。

#13


不是恼,只是人敬我三分我敬人七分!

还是拜托你,仔细想想好不好!

连接和分配服务器线程是有区别的,你的方法只能拒绝分配线程,客户端已经连接上了!这样很可能导致系统不能提供任何服务!要满足搂主要求要在Winsock那一层解决!

#14


要是你们能仔细看看,就明白了。
这就是在应用层断开客户端的请求连接的

在应用层写入:
function TServer.login(const client_no: WideString;): OleVariant;
var
  flag:integer;
begin 
  flag:=2;//
  if clientnumber>=100 then
  begin
    flag:=1;
    self.Destroy;
  end;
  result:=flag;
end;

客户端就调用应用层的程序,根据返回状态来启动或关闭程序

#15


在CORBA中楼上的的确可行,但在Socket中您的服务器方法需要客户端连接服务器后,主动地断开连接,当另有人使用他自己的客户端连接时,在没有身份验证的情况下可以任意连接服务器,在有安全策略的情况下,当客户端不释放连接会使服务器造成DOS攻击式的拒绝服务,不满足搂主的初衷。
只能在Winsock那一层加以限制,当客户端发出连接请求时,拒绝连接。
当客户端想了解连接状态时,可以改写onSocketEvent,当为seLookup时无法连接,是无法连接服务器,当为seConnecting时无法连接,是服务器因为某原因积极地拒绝。
我的ShowMessage('连接数已满');只是一个象征意义的语句,并不是说就是弹出对话框,只需填入服务器相应代码即可。

#16


谢谢大家的帮助
不过我有一点不明白的是
到底是在代理服务器上控制还是在中间层应用服务器上控制好
我觉得如果能在自己写的中间层上控制可能会好点。
但是我不知道在中间层上怎样才能做到像Scktsrvr代理中
显示连接的客户数,如果能做到我就能在客户端连接中间层时
根据中间层的客户联接数返回一个值回客户端,根据这个值我就可以
决定是否让客户端连接进来了

#17


当然是在中间层上控制,搂主可能不知道我所说的ScktComp单元在哪,起什么作用,如下:
你的SocketConnection需要引用SConnect 而SConnect又引用ScktComp,在Accept中修改代码即可达到搂主的目的。

#18


DELPHI中的例子中,有一个程序,

#19


http://community.csdn.net/Expert/topic/3195/3195626.xml?temp=.3226892

#1


这个验证放到应用层吧!!客户端连接后,应用层判断连接数量,大于就杀死这个客户端连接时创建的应用层的线程。

#2


To Erice:
能详细说明下么,应用层怎么判断连接数,还有怎么杀死这个客户端连接时创建的应用层的线程。

#3


这东西不复杂,修改ScktSrvr的源代码,把里面的一段

procedure TSocketDispatcher.GetThread(Sender: TObject;
  ClientSocket: TServerClientWinSocket;
  var SocketThread: TServerClientThread);
begin
  if Self.Socket.ActiveConnections <= 100 then  // 增加这句,100表示连接上限
    SocketThread := TSocketDispatcherThread.Create(False, ClientSocket,
      InterceptGUID, Timeout, SocketForm.RegisteredAction.Checked, SocketForm.AllowXML.Checked);
end;

#4


在ScktComp的TServerWinSocket.Accept 中加入  
if Self.ActiveConnections <= 10 then 
begin
...
end;
的限制。

#5


To: pazee(耙子)(灵感点亮生活)
谢谢你的指点,我试了一下,你的方法可以控制连接数。
但是当超过连接数的时候,客户端却不停的去连接而又连接不上,
给客户看起来好象是系统Down机的感觉。
能不能在客户连接的时候,给客户端'连接数已满'等提示

#6


在应用层写入:
function TServer.login(const client_no: WideString;): OleVariant;
var
  flag:integer;
begin 
  flag:=2;//
  if clientnumber>=100 then
  begin
    flag:=1;
    self.Destroy;
  end;
  result:=flag;
end;

客户端就调用应用层的程序,根据返回状态来启动或关闭程序

#7


在ScktComp的TServerWinSocket.Accept 中加入  
if Self.ActiveConnections <= 10 then 
begin
...
end
else
begin
  ShowMessage('连接数已满');
end;
的限制。

#8


当然上面的ShowMessage('连接数已满');
只是一个代表,在ScktComp中,你还可以找到ClientSocket在相应的Connect中加入条件限制即可。

#9


楼上的楼上的想法纯粹胡闹,这个限制是在服务器端的,你蹦出来“连接已满”给谁看的?



你的这个要求实现有些困难。这个应该需要服务器端客户端配合才行。

服务器端负责计数、通知客户端“连接已满”并断开连接。

客户端,如果得到连接已满的信息,则不在立即重试。

不过实现起来不简单。

#10


pazee(耙子)(灵感点亮生活) 对啊
应该需要服务器端客户端配合才行。

--------------------
应该让和客户端约定收到什么数据表示什么意思
服务器端达到最大连接后给客户端发送特定的数据

#11


pazee(耙子)(灵感点亮生活)用点脑筋想好不好!如果搂主的程序服务器和客户端配合是能解决限制搂主客户端的连接数,但不能达到真正限制连接数的初衷,若你再编写一个客户端一样可以连接上搂主的服务器。
应当在服务器端加以限制,客户端不可以作指望的。当服务器端拒绝连接时,客户端只能弹出不能连接服务器的对话框,现在大多数应用都是这么做的。

#12


楼上的恼了?

你没仔细看我的话,我说的配合是服务器通知客户端不能连接的原因,让客户端能得到原因,这就达到楼主的目的。
楼主想知道不能连接的原因。

断开当然是在服务器上作的,这个从始至总都是这么说的。

你写一百个同样的客户端也是连不上的。

#13


不是恼,只是人敬我三分我敬人七分!

还是拜托你,仔细想想好不好!

连接和分配服务器线程是有区别的,你的方法只能拒绝分配线程,客户端已经连接上了!这样很可能导致系统不能提供任何服务!要满足搂主要求要在Winsock那一层解决!

#14


要是你们能仔细看看,就明白了。
这就是在应用层断开客户端的请求连接的

在应用层写入:
function TServer.login(const client_no: WideString;): OleVariant;
var
  flag:integer;
begin 
  flag:=2;//
  if clientnumber>=100 then
  begin
    flag:=1;
    self.Destroy;
  end;
  result:=flag;
end;

客户端就调用应用层的程序,根据返回状态来启动或关闭程序

#15


在CORBA中楼上的的确可行,但在Socket中您的服务器方法需要客户端连接服务器后,主动地断开连接,当另有人使用他自己的客户端连接时,在没有身份验证的情况下可以任意连接服务器,在有安全策略的情况下,当客户端不释放连接会使服务器造成DOS攻击式的拒绝服务,不满足搂主的初衷。
只能在Winsock那一层加以限制,当客户端发出连接请求时,拒绝连接。
当客户端想了解连接状态时,可以改写onSocketEvent,当为seLookup时无法连接,是无法连接服务器,当为seConnecting时无法连接,是服务器因为某原因积极地拒绝。
我的ShowMessage('连接数已满');只是一个象征意义的语句,并不是说就是弹出对话框,只需填入服务器相应代码即可。

#16


谢谢大家的帮助
不过我有一点不明白的是
到底是在代理服务器上控制还是在中间层应用服务器上控制好
我觉得如果能在自己写的中间层上控制可能会好点。
但是我不知道在中间层上怎样才能做到像Scktsrvr代理中
显示连接的客户数,如果能做到我就能在客户端连接中间层时
根据中间层的客户联接数返回一个值回客户端,根据这个值我就可以
决定是否让客户端连接进来了

#17


当然是在中间层上控制,搂主可能不知道我所说的ScktComp单元在哪,起什么作用,如下:
你的SocketConnection需要引用SConnect 而SConnect又引用ScktComp,在Accept中修改代码即可达到搂主的目的。

#18


DELPHI中的例子中,有一个程序,

#19


http://community.csdn.net/Expert/topic/3195/3195626.xml?temp=.3226892