Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在服务器处于活动状态时绑定新服务器绑定_Delphi_Indy_Freepascal - Fatal编程技术网

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

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;

在服务器处于活动状态时,如何让操作系统将可用端口分配给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; 
将打印以下内容:

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客户端设计为在发送数据包时,如果操作系统报告其侦听端口已关闭,则停止向服务器发送数据包