restemplate/indy/Protocols/IdMappedPortUDP.pas

119 lines
2.8 KiB
Plaintext

{
$Project$
$Workfile$
$Revision$
$DateUTC$
$Id$
This file is part of the Indy (Internet Direct) project, and is offered
under the dual-licensing agreement described on the Indy website.
(http://www.indyproject.org/)
Copyright:
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
}
{
$Log$
}
{
Rev 1.6 7/21/04 3:14:04 PM RLebeau
Removed local Buffer variable from TIdMappedPortUDP.DoUDPRead(), not needed
Rev 1.5 2004.02.03 5:44:00 PM czhower
Name changes
Rev 1.4 2/2/2004 4:20:30 PM JPMugaas
Removed warning from Delphi 8. It now should compile in DotNET.
Rev 1.3 1/21/2004 3:11:34 PM JPMugaas
InitComponent
Rev 1.2 10/25/2003 06:52:14 AM JPMugaas
Updated for new API changes and tried to restore some functionality.
Rev 1.1 2003.10.24 10:38:28 AM czhower
UDP Server todos
Rev 1.0 11/13/2002 07:56:46 AM JPMugaas
}
unit IdMappedPortUDP;
interface
{$i IdCompilerDefines.inc}
{
- Syncronized with Indy standards by Gregor Ibic
- Original DNS mapped port by Gregor Ibic
}
uses
Classes,
IdGlobal,
IdUDPServer,
IdSocketHandle,
IdGlobalProtocols;
type
TIdMappedPortUDP = class(TIdUDPServer)
protected
FMappedPort: TIdPort;
FMappedHost: String;
FOnRequest: TNotifyEvent;
//
procedure DoRequestNotify; virtual;
procedure InitComponent; override;
procedure DoUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); override;
published
property MappedHost: string read FMappedHost write FMappedHost;
property MappedPort: TIdPort read FMappedPort write FMappedPort;
property OnRequest: TNotifyEvent read FOnRequest write FOnRequest;
end;
implementation
uses
IdAssignedNumbers,
IdUDPClient, SysUtils;
procedure TIdMappedPortUDP.InitComponent;
begin
inherited InitComponent;
DefaultPort := IdPORT_DOMAIN;
end;
procedure TIdMappedPortUDP.DoRequestNotify;
begin
if Assigned(OnRequest) then begin
OnRequest(Self);
end;
end;
procedure TIdMappedPortUDP.DoUDPRead(AThread: TIdUDPListenerThread;
const AData: TIdBytes; ABinding: TIdSocketHandle);
var
LClient: TIdUDPClient;
LData: TIdBytes;
i: Integer;
begin
inherited DoUDPRead(AThread, AData, ABinding);
DoRequestNotify;
LClient := TIdUDPClient.Create(nil);
try
LClient.Host := FMappedHost;
LClient.Port := FMappedPort;
LClient.SendBuffer(AData);
SetLength(LData, LClient.BufferSize);
i := LClient.ReceiveBuffer(LData);
if i > 0 then begin
SetLength(LData, i);
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, LData, 0, i, ABinding.IPVersion);
end;
finally
FreeAndNil(LClient);
end;
end;
end.