Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Порт мапинг UDP протокола [D6, Win2k]


Dmitriy_R ©   (2003-11-19 07:26:00) 

Народ подскажите как реализовать простой порт мапинг по UDP протоколу. Тоесть надо слушать UDP порт и перенаправлять все что на него приходит на другую машину и другой порт.
Заранее спасибо.


Dmitriy_R   (2003-11-19 11:37:00) [1]

Не получается :-(
Вот мой исходный код, может кто подскажет где ошибка.

unit UDPServerMain;

interface

uses
{$IFDEF Linux}
QGraphics, QControls, QForms, QDialogs, QStdCtrls,
{$ELSE}
windows, messages, graphics, controls, forms, dialogs, IdWinsock, stdctrls,
{$ENDIF}
SysUtils, Classes, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze,
IdComponent, IdUDPBase, IdUDPClient, IdStack, IdUDPServer, IdSocketHandle;

type
TUDPMainForm = class(TForm)
UDPServer: TIdUDPServer;
UDPAntiFreeze: TIdAntiFreeze;
UDPMemo: TMemo;
UDPClient: TIdUDPClient;
procedure FormCreate(Sender: TObject);
procedure UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
private
{ Private declarations }
public
{ Public declarations }
end;

var
UDPMainForm: TUDPMainForm;

implementation

const
HOSTNAMELENGTH = 80;
RECIEVETIMEOUT = 5000; // milliseconds

{$IFDEF MSWINDOWS}{$R *.dfm}{$ELSE}{$R *.xfm}{$ENDIF}

procedure TUDPMainForm.FormCreate(Sender: TObject);
begin
UDPServer.Active := True;
UDPClient.ReceiveTimeout := RECIEVETIMEOUT;
end;

procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
ReceivedString: String;
begin
DataStringStream := TStringStream.Create("");
try
DataStringStream.CopyFrom(AData, AData.Size);
UDPMemo.Lines.Add("Сервер принял :" + DataStringStream.DataString + " from " + ABinding.PeerIP + " on port " + IntToStr(ABinding.PeerPort));

UDPClient.Send(DataStringStream.DataString);
UDPMemo.Lines.Add("Клиент отправил :" + DataStringStream.DataString);

ReceivedString := UDPClient.ReceiveString();
UDPMemo.Lines.Add("Клиент принял :" + ReceivedString);

ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, ReceivedString, Length(ReceivedString));
UDPMemo.Lines.Add("Сервер отправил :" + ReceivedString + " -> " + IntToStr(Length(ReceivedString)));
finally
DataStringStream.Free;
end;
end;

end.


RedKat   (2003-11-19 10:22:00) [2]

С одной стороны компонент-сервер слушающий нужный тебе UDP порт, при приеме блока он передает его компоненту-клиенту (в этом-же приложении) кот. передает его дальше на нужную машину и порт.


Наверх

Титульная страница Поиск, карта сайта Написать письмо