当服务器处于活动状态时,我如何让OS将可用端口分配给Indy服务器中的新绑定?
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
有什么方法可以在不停用服务器的情况下完成此操作?
因为我不想在添加新绑定时丢失任何活动的客户端。
目前,当它已经处于活动状态[[1时,您不能向TIdUDPServer
添加新的监听端口。它根本不允许这样做(与TIdTCPServer
相比)。 TIdUDPServer
的侦听端口仅在其Active
属性从False切换为True时才打开。
1:好,您可以随意调用Bindings.Add()
,但是新绑定在TIdUDPServer
中不会起作用。
Bindings.Add()
时,它将服务器的DefaultPort
分配给新Port
对象的TIdSocketHandle
属性。默认情况下,DefaultPort
为0。但是要真正打开TIdSocketHandle.Port
来侦听数据包,首先需要停用TIdUDPServer
。以您的方式呼叫TIdSocketHandle.Bind()
无效,因为您没有事先呼叫TIdSocketHandle.AllocateSocket()
,因此TIdSocketHandle.Handle
对于Bind()
无效无效。但是,即使您确实使Bind()
正常工作,也仍然无济于事,因为TIdUDPServer
仅在Binding
属性切换为True时,才为每个Active
对象创建一个单独的侦听器线程。在服务器已经处于活动状态时添加到TIdSocketHandle
的C0]对象将不会读取要提供给Bindings
事件处理程序的数据包。
因此,如果要修改OnUDPRead
中的Bindings
端口,必须先设置TIdUDPServer
,然后根据需要进行修改,然后再设置Active=False
。我已为您向Indy的问题跟踪器添加了增强请求:
Active=True
请注意,UDP是无连接的,因此您不会像TCP中那样“丢失客户端”,除非您的UDP客户端被设计为在操作系统将监听端口报告为关闭时停止向服务器发送数据包。发送数据包时。