Wszystkie operacje TURN opierają się na alokacjach, a wszystkie wiadomości TURN są powiązane z alokacją. Alokacja składa się z:
Gdy klient TURN wysyła żądanie Allocate, ta wiadomość TURN jest przetwarzana przez serwer, który próbuje utworzyć nowy przekazany adres transportowy. Domyślnie, jeśli dostępny jest jakikolwiek port UDP, zostanie utworzony nowy adres przekazywania, jednak zdarzenie OnTURNBeforeAllocate pozwala odrzucić nowe żądanie alokacji.
procedure OnTURNBeforeAllocate(Sender: TObject; const aSocket: TsgcSocketConnection;
const aIP: string; aPort: Word; var Reject: Boolean);
begin
if not (your own rules) then
Reject := false;
end;
Jeśli proces jest kontynuowany, serwer tworzy nową alokację i wywoływane jest zdarzenie OnTURNCreateAllocation. Zdarzenie to dostarcza informacji o alokacji za pośrednictwem klasy TsgcTURNAllocationItem.
procedure OnTURNCreateAllocation(Sender: TObject; const aSocket: TsgcSocketConnection;
const Allocation: TsgcTURNAllocationItem);
begin
DoLog('New Allocation: ' + Allocation.RelayIP + ':' + IntToStr(Allocation.RelayPort));
end;
Gdy alokacja wygaśnie lub zostanie usunięta po odebraniu żądania Refresh od klienta z czasem życia równym zero, wywoływane jest zdarzenie OnTURNDeleteAllocation.
procedure OnTURNDeleteAllocation(Sender: TObject; const aSocket: TsgcSocketConnection;
const Allocation: TsgcTURNAllocationItem);
begin
DoLog('Allocation Deleted: ' + Allocation.RelayIP + ':' + IntToStr(Allocation.RelayPort));
end;