![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пример port mapping
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 не работает как ожидалось ?