如何在服务器处于活动状态时绑定新服务器绑定

问题描述 投票:0回答:1

当服务器处于活动状态时,我如何让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

有什么方法可以在不停用服务器的情况下完成此操作?

因为我不想在添加新绑定时丢失任何活动的客户端。

delphi indy freepascal
1个回答
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客户端被设计为在操作系统将监听端口报告为关闭时停止向服务器发送数据包。发送数据包时。

© www.soinside.com 2019 - 2024. All rights reserved.