Нужно на TidUDPServer сделать реюз адреса. Чтобы несколько приложений могли слушать один порт.
Как это правильно сделать?
Сделал наследника:
function TStrikerUDPServer.GetBinding: TIdSocketHandle;
var
i: integer;
begin
if FCurrentBinding = nil then begin
if Bindings.Count < 1 then begin
Bindings.Add;
end;
for i := 0 to Bindings.Count - 1 do begin
Bindings[i].AllocateSocket(Integer(Id_SOCK_DGRAM));
Bindings[i].AllocateSocket(Id_SOCK_DGRAM);
ReuseAddrEnabledChanged;
Bindings[i].Bind;
end;
FCurrentBinding := Bindings[0];
FListenerThread := TIdUDPListenerThread.Create(BufferSize, Self);
FListenerThread.Start;
BroadcastEnabledChanged;
end;
Result := FCurrentBinding;
end;
procedure TStrikerUDPServer.ReuseAddrEnabledChanged;
var
i: integer;
begin
if Assigned(FCurrentBinding) then begin
for i := 0 to Bindings.Count - 1 do begin
SetReuseAddrFlag(FReuseAddrEnabled, Bindings[i]);
end;
end;
end;
procedure TStrikerUDPServer.SetReuseAddrEnabled(AValue: Boolean);
begin
if FReuseAddrEnabled <> AValue then begin
FReuseAddrEnabled := AValue;
if Active then begin
ReuseAddrEnabledChanged;
end;
end;
end;
procedure TStrikerUDPServer.SetReuseAddrFlag(AEnabled: Boolean;
ABinding: TIdSocketHandle);
begin
if ABinding = nil then begin
ABinding := Binding;
end;
GStack.SetSocketOption(ABinding.Handle,Id_SOL_SOCKET, Id_SO_REUSEADDR, iif(AEnabled,1,0));
end;
но он работает по старому, REUSE игнорируется.