-
Мне это не приснилось? Видел когда-то такой пример, что делался некий туннель, смысл которого сводился к тому, что на компьютере запускалась программа и она все входящие соединения на некий порт локального адреса перебрасывала на другой адрес. Ну вроде того, что например мы указываем в почтовом клиенте адрес localhost:1234 а все соединения приходящие перебрасывались на mail.maildomain.com:4321. При этом это не было отдельным mail-сервром и mail-клиентом в программе. Видел я такое когда-то очень давно кажется в примерах для Indy. Такое существует, если да, то как это называется?
-
Виртуальный сервер, прокси-сервер, порт форвардинг.
-
> AnatV (12.12.07 11:57)
Поясни, каков прикладной смысл ожидается тобой в такой "переброске" ? От этого и решение зависит.
-
http туннель например? как работает: 1. локальный сервер(ЛС) принимает http запросы(пакеты), упаковывает(и возможно зашифровыват). 2. ЛС отсылает пакеты на некий внешний сервер(ВС) в и-нете 3. ВС распаковывает запрос посылает по нужному адресу 4. ВС принимается ответ, упаковывает, пересылает ЛС 5. ЛС распаковывает ответ, отдает локальному клиенту. таким образом локальному клиенту (fe:браузер) работа с внешним сервером (http) получается прозрачной.
для чего используется: например для обхода на работе запрета доступа к нек.сайтам
-
Посмотрел в интернете - кажется нашел название - это Port Mapping было, в инди кажется и был такой класс.
Но меня интересует сам процесс этого. Задача такая, нужно отловить пакет - и исправить в нем допустим 5 байт, все остальное оставить как есть.
Если представить абстрактно сам такой процесс, то это: отдельно сервер, отдельно клиент - и сервер принимает все подключения и перебрасывает данные на уже подключенный клиентский сокет, ну и наоборот - это так?
-
> AnatV (12.12.07 11:57)
вот пример на Indy
OutboundClient := TIdTCPClient.Create(Self);
try
OutboundClient.Host := ; OutboundClient.Port := ; OutboundClient.ConnectTimeout := DEFAULT_CONNECTION_TIMEOUT;
OutboundClient.ReadTimeout := DEFAULT_READ_TIMEOUT;
OutboundClient.Connect;
OutboundClient.Socket.UseNagle := False;
while AContext.Connection.Connected do
begin
AContext.Connection.IOHandler.CheckForDataOnSource(1);
FNetData := AContext.Connection.IOHandler.InputBufferAsString;
if Length(FNetData) > 0 then
begin
OutboundClient.IOHandler.Write(FNetData);
end;
OutboundClient.IOHandler.CheckForDataOnSource(1);
FNetData := OutboundClient.IOHandler.InputBufferAsString;
if Length(FNetData) > 0 then
begin
AContext.Connection.IOHandler.Write(FNetData);
end;
end;
finally
OutboundClient.Free;
end;
-
естесственно данный код нужно выполнять в OnExecute сервера.
|