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

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

Пример port mapping


Страницы:   1 2

ZeroXider ©   (2006-08-07 22:00:00) 

Здравствуйте.

Нужен работающий пример организации качаственного port mapping'a. Знаю, что в Indy есть подходящий компонент (TIdMappedPortTCP), только вот он отказывается нормально работать со сложным (когда поток данных часто меняет свое направление от клиента-к-серверу) самописным протоколом на базе TCP. Это не из-за моей кривости рук, это действительно так.

Я не прошу делать за меня программу, интересует любая полезная информация по данной теме - порт-маппинг и тунелирование трафика.

Спасибо.


ZeroXider   (2006-08-08 17:48:00) [1]


> Сергей М. ©   (08.08.06 17:02) [26]

ну это понятно, что пример чисто демонстрационный, особенно судя по строке
> ss.Socket.Connections [0].SendBuf(s[1],Len);

))
но в любом случае, я в своем проекте не буду использовать TServer/ClientSocket.
будет что-то вроде [25] (по аналогии с TIdMappedPortTCP), кстати работает стабильно вроде, только вот надо CheckForDataOnSource заменить на хотя бы CheckForDataOnSource(1);


Пусик   (2006-08-08 17:32:00) [2]


> Сергей М. ©   (08.08.06 17:02) [26]
> > ZeroXider   (08.08.06 16:23) [23]Пример в [1], при всем
> уважении к коллеге Пусик (С), есть потенциальный источник
> известных транспортных ошибок и брать его за пример стоит
> лишь концептуально.


Полностью поддерживаю;)


Сергей М.   (2006-08-08 17:02:00) [3]


> ZeroXider   (08.08.06 16:23) [23]


Пример в [1], при всем уважении к коллеге Пусик (С), есть потенциальный источник известных транспортных ошибок и брать его за пример стоит лишь концептуально.


ZeroXider   (2006-08-08 16:52:00) [4]


> Сергей М. ©   (08.08.06 16:50) [24]

угу, эт тоже уже понял )
если кому интересно - вот простейший работающий пример на Indy.
procedure TfmMain.MappedServExecute(AContext: TIdContext);
var
 OutboundClient: TIdTCPClient;
 FNetData: string;
begin
 //m1.Lines.Add('Connected to mapped serv.');
 OutboundClient := TIdTCPClient.Create;
 try
   OutboundClient.Host := '127.0.0.1';
   OutboundClient.Port := 5050;
   //OutboundClient.ConnectTimeout := 5000;
   //OutboundClient.ReadTimeout := 5000;
   OutboundClient.Connect;
   while AContext.Connection.Connected do
   begin
     AContext.Connection.IOHandler.CheckForDataOnSource;
     FNetData := AContext.Connection.IOHandler.InputBufferAsString;
     if Length(FNetData) > 0 then
     begin
       OutboundClient.IOHandler.Write(FNetData);
     end;
     OutboundClient.IOHandler.CheckForDataOnSource;
     FNetData := OutboundClient.IOHandler.InputBufferAsString;
     if Length(FNetData) > 0 then
     begin
       AContext.Connection.IOHandler.Write(FNetData);
     end;
   end;
 finally
   OutboundClient.Free;
 end;
end;


спасибо всем за помощь и терпение.


Сергей М.   (2006-08-08 16:50:00) [5]


> на блокирующих сокетах задачу решить сложнее


Ничуть не сложнее чем на неблокирующих.


ZeroXider   (2006-08-08 16:23:00) [6]


> Пусик ©   (08.08.06 15:57) [20]

приношу искреннее извинения за [2], ваш пример действительно прекрасно работает... !!! спасибо ещё раз!

> Сергей М. ©   (08.08.06 16:06) [22]

кажется я начинаю понимать, что вы имели ввиду...
правда на блокирующих сокетах задачу решить сложнее.


Сергей М.   (2006-08-08 16:06:00) [7]


> ZeroXider   (08.08.06 15:37) [19]



> меня интересут именно то, каким образом порт-маппер, не
> зная конкретного прикладного протокола, умеет перенаправлять
> данные


А ему, мапперу, до лампочки твои прикладные протоколы)
Маппер работает со стримом- получает из вх.стрима некие двоичные данные (неважно какого логического содержимого) и тут же (безо всякой обработки !) перенаправляет полученное в вых.стрим.

А вот прокси- он как раз аккумулирует вх.стрим, анализирует данные во вх.стриме на предмет прикладного протокола и , если надо, формирует данные в соответствии с прикл.протоколом для записи в вых.стрим.

Иными словами, прокси - это "интеллектуальный маппер".


Reindeer Moss Eater   (2006-08-08 16:05:00) [8]

меня интересут именно то, каким образом порт-маппер, не зная конкретного прикладного протокола, умеет перенаправлять данные.

Не зная прикладного протокола, иначе как работая с буфером длиной в один байт задачу не решить.
Скорее всего.


Пусик   (2006-08-08 15:57:00) [9]

> ZeroXider   (08.08.06 03:50) [2]
> > Пусик ©   (07.08.06 22:20) [1]хех.. за пример конечно
> благодарен, но интересует не на столько уж простенький порт-
> маппер... что если в вашем примере данные нужно будет передать
> в обратном направлении в произвольный (или не очень) момент
> времени, например как в случае с FTP или более простым HTTP.
> .. весь ваш порт-маппер накроется медным тазиком (

/I>

Непонятна твоя проблема. Ты имеешь ввиду именно порт-маппер, а не что-то другое?
Приведенный пример именно так и работает - как прозрачный порт-маппер.

Что означает "обратное направление"? Особенно при упоминании http?


ZeroXider   (2006-08-08 15:37:00) [10]


> Сергей М. ©   (08.08.06 15:30) [18]

TIdTCPServer принимает/отсылает данные посредствомпротокола TCP/IP, но вот в какой последовательности и когда принимать и отсылать данные - решает уже прикладной протокол, использующий TCP/IP просто как транспорт.

меня интересут именно то, каким образом порт-маппер, не зная конкретного прикладного протокола, умеет перенаправлять данные.


Сергей М.   (2006-08-08 15:30:00) [11]


> Обычный (не порт-маппер) сервер/клиент принимает/отсылает
> данные в соответствии с протоколом


Что за глупости ?

Тот же самый TIdMappedPortTCP есть прямой наследник TIdTCPServer.
И с каких же пор, спрашивается, TIdTCPServer работает на уровне какого-то прикладного протокола ?


ZeroXider   (2006-08-08 15:22:00) [12]


> Сергей М. ©   (08.08.06 15:13) [16]


> Точно так же как и обычный (не порт-маппер) сервер или клиент
> узнает об этом.

Обычный (не порт-маппер) сервер/клиент принимает/отсылает данные в соответствии с протоколом. А размер данных, опять же, либо фиксирован, либо отсылается непосредственно перед данными, опять же, в соответсвии с прикладным протоколом. Так откуда порт-мапперу знать особенности какого-то там прикладного протокола? имхо там механизм немного другой.


Сергей М.   (2006-08-08 15:13:00) [13]


> Как промежуточный сервер узнает о том, что нужно принимать
> данные или отсылать их и какой их объем?


Точно так же как и обычный (не порт-маппер) сервер или клиент узнает об этом.

Может быть тебе рано о порт-маппере говорить ?

Ведь порт-маппер - это обычный сервер + куча обычных клиентов ..
Без знания особенностей работы с каждым из них бессмысленно говорить о сквозной логике работы порт-маппера ..


ZeroXider   (2006-08-08 15:06:00) [14]


> Сергей М. ©   (08.08.06 14:48) [14]

дык самое обидное, что только что скачал вполне работоспособный пример, написаный на Билдере с исп. Инди 9. http://www.download.ru/search.ehtml?l=0&t=3&c=0&q=Easy+Port+MapperEasy Port Mapper. Программа с исходным кодом. А на Indy 10 никак работать не хочет этот компонент.


> Любая пара надежно работающих компонентов, реализующих TCP-
> сервер/клиент, с успехом заменит сабж.

да это понимаю. скорее всего прийдется так и поступить - написать самому. Вот только есть один момент, который мне непонятен, в реализации порт-маппинга.
Как промежуточный сервер узнает о том, что нужно принимать данные или отсылать их и какой их объем? (


Сергей М.   (2006-08-08 14:48:00) [15]

Но на Индейцах свет клином не сошелся)
Любая пара надежно работающих компонентов, реализующих TCP-сервер/клиент, с успехом заменит сабж.


Сергей М.   (2006-08-08 14:47:00) [16]

Сожалею.


ZeroXider   (2006-08-08 14:25:00) [17]


> Сергей М. ©   (08.08.06 14:22) [11]

я тоже помню, что когда еще пользовался 9 версией - этот пример у меня работал, к сожалению в 10 версии это не так (


Сергей М.   (2006-08-08 14:22:00) [18]

За Indy10 ничего скуазать не могу.

В 9-ке тот же самый пример работает безукоризненно.


ZeroXider   (2006-08-08 14:15:00) [19]


> Сергей М. ©   (08.08.06 14:01) [9]


> О них, только не в клиентском приложении, а в самом приложении
> порт-маппера.

там настройки не трогал, все по-умолчанию.

> Хочешь сказать, что штатный демо-пример с использованием
> TIdMappedPortTCP не работает как ожидалось ?

именно это я и хочу сказать: простейший MappedPort пример под названием Proxy.exe, скомпилированный с исп. Indy 10 не работает.

более того, такая проблема не только у меня http://groups.google.com/group/borland.public.delphi.internet.winsock/browse_thread/thread/7dbe6faad6207817

если бы было все решалось просто, помощи бы не просил.


Сергей М.   (2006-08-08 14:01:00) [20]


> о них?


О них, только не в клиентском приложении, а в самом приложении порт-маппера.


> как грамотно построить нормальный порт-маппер.


Хочешь сказать, что штатный демо-пример с использованием TIdMappedPortTCP не работает как ожидалось ?


Страницы:   1 2

Наверх

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