Конференция "Сети" » SO_REUSEADDR в Indy
 
  • @!!ex © (18.08.11 16:15) [0]
    Нужно на TidUDPServer сделать реюз адреса. Чтобы несколько приложений могли слушать один порт.
    Как это правильно сделать?

    Сделал наследника:
    { TStrikerUDPServer }

    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
    {$IFDEF LINUX}
         Bindings[i].AllocateSocket(Integer(Id_SOCK_DGRAM));
    {$ELSE}
         Bindings[i].AllocateSocket(Id_SOCK_DGRAM);
    {$ENDIF}
         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 игнорируется.
  • @!!ex © (18.08.11 16:16) [1]
    Ошибся разделом. Перенесите пожалуйста в "Сети".
  • Rouse_ © (19.08.11 14:19) [2]
    На сколько я помню при реюзе слушать будет только последний...
  • Вариант (19.08.11 14:31) [3]
    Если не бродкаст или мультикаст рассылка, то получать данные будет только один сокет, не смотря на REUSE, какой именно точно не определено.
  • Eraser © (21.08.11 04:01) [4]
    > [0] @!!ex ©   (18.08.11 16:15)

    у реюза другое предназначение.
 
Конференция "Сети" » SO_REUSEADDR в Indy
Есть новые Нет новых   [134435   +15][b:0][p:0.001]