Delphi 如何在服务器处于活动状态时绑定新服务器绑定
在服务器处于活动状态时,如何让操作系统将可用端口分配给Indy server中的新绑定Delphi 如何在服务器处于活动状态时绑定新服务器绑定,delphi,indy,freepascal,Delphi,Indy,Freepascal,在服务器处于活动状态时,如何让操作系统将可用端口分配给Indy server中的新绑定 IdUDPServer.Active := True; for I := 0 to 4 do begin IdUDPServer.Bindings.add; end; for I := 0 to IdUDPServer.Bindings.Count-1 do begin WriteLn(IdUDPServer.Bindings[I].Port); end;
IdUDPServer.Active := True;
for I := 0 to 4 do
begin
IdUDPServer.Bindings.add;
end;
for I := 0 to IdUDPServer.Bindings.Count-1 do
begin
WriteLn(IdUDPServer.Bindings[I].Port);
end;
将打印以下内容:
40371
0
0
0
0
0
我试试这个
var
H : TIdSocketHandle;
...
for I := 0 to 4 do
begin
H := IdUDPServer.Bindings.add;
try
H.Bind;
except
On E: Exception do
WriteLn(e.Message);
end;
end;
...
我得到以下信息:
Socket Error # 9
Bad file number.
Socket Error # 9
Bad file number.
Socket Error # 9
Bad file number.
Socket Error # 9
Bad file number.
Socket Error # 9
Bad file number.
56554
0
0
0
0
0
有没有办法在不停用和响应服务器的情况下实现这一点
因为我不想在添加新绑定时丢失任何活动客户端。此时,您不能在
TIdUDPServer
处于活动状态时向其添加新的侦听端口1。它根本不允许这样做(与TIdTCPServer
相比,后者是)TIdUDPServer
的侦听端口仅在其Active
属性从False切换为True时打开
1:好的,您可以调用绑定。Add()
所有您想要的,但是新绑定在TIdUDPServer
中没有任何效果
调用Bindings.Add()
时,它会将服务器的DefaultPort
分配给新TIdSocketHandle
对象的Port
属性。默认情况下,DefaultPort
为0。但要真正打开TIdSocketHandle.Port
侦听数据包,首先需要停用TIdUDPServer
调用TIdSocketHandle.Bind()
会在可访问时更新TIdSocketHandle.Port
(从而允许您绑定到端口0以分配可用的临时端口),但是使用Bind()
的方式不起作用,因为您事先没有调用TIdSocketHandle.AllocateSocket()
,因此,TIdSocketHandle.Handle
对于要使用的Bind()
无效。但是,即使您确实让Bind()
工作,它也不会对您有所帮助,因为TIdUDPServer
仅当Active
属性切换为True时,才会为每个Binding
对象创建单独的侦听器线程,因此,当服务器处于活动状态时,添加到绑定
的任何新TIdSocketHandle
对象都不会读取数据包以提供给OnUDPRead
事件处理程序
因此,如果要修改TIdUDPServer
中的绑定
端口,必须首先设置Active=False
,然后根据需要进行修改,然后设置Active=True
。我已为您在Indy的问题跟踪程序中添加了一个增强请求:
请注意,UDP连接较少,因此您不会像TCP中那样“丢失客户端”,除非您的UDP客户端设计为在发送数据包时,如果操作系统报告其侦听端口已关闭,则停止向服务器发送数据包