Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Вниз

Использование TClientSocket внутри TServerClientThread 


Иван Мхитаров   (2001-12-03 13:45) [0]

Из формы TClientSocket нормально подключается а из отдельного TServerClientThread затыкается на Lookup.

Web сервер уже сделал, теперь хочу сделать что-то типа многопоточного роутера и хочется это сделать на нативных компонентах.

Устанавливаю обработчики
FClientSocket.OnError:=ClientSocketError;
FClientSocket.OnRead:=ClientSocketRead;
FClientSocket.OnLookup:=ClientSocketLookup;
FClientSocket.OnConnecting:=ClientSocketConnecting;
FClientSocket.OnConnect:=ClientSocketConnect;
Настраиваю host и port, вызываю Open, заходит в обработчик ClientSocketLookup а дальше никуда:-(

Если делать FClientSocket.Socket.LookupName(FClientSocket.Host), хост определяется нормально.

Как лыжи смазать, чтобы поехали?
D5.



digitman   (2001-12-03 14:02) [1]

Какое отношение объект класса TClientSocket (клиентский компонент) имеет к объекту класса TServerClientThread (транспортный поток сервера, создаваемый для соединения с отдельным клиентом) ? Где в твоем коде хоть какое-то упоминание о TServerSocket ? Ведь это он создает объект класса TServerClientThread !



Иван Мхитаров   (2001-12-03 15:18) [2]

TServerSocket лежит на главной форме и при обращении создает переопределенный TServerClientThread. У него изменены ClientExecute, Create и Destroy.

В Create динамически создается TClientSocket, настраивается его хост, адрес и порт а так же обработчики событий привязываются к соответствующим методам этого треда.

После получения запроса в TServerClientThread производится попытка открыть внутренний TClientSocket, он доходит до Lookup (обработчик вызывается) а OnConnecting и OnConnected не вызываются.
В итоге тред самоуничтожается через 1 минуту, не дождавшисть ничего:-(

Все проверялось на существующих хостах.



Digitman   (2001-12-03 15:36) [3]

Зачем на стороне сервера создавать TClientSocket ?
Да еще для каждого вновь подключающегося клиента ?
Да еще наверняка не разрушающийся при закрытии коннекта с клиентом (ThreadCacheSize!!!!!) ?
Ты прокси что ли делаешь ? Так для прокси-сервера достаточно одного TClientSocket на всех собственных клиентов - все же клиенты, обращающиеся к прокси, осуществляют коннект к одному порту, тому, на котором "слушает" сам TServerSocket !



Иван Мхитаров   (2001-12-03 16:32) [4]

У меня все нормально высвобождается.

А можно поподробнее или пример кода?
Нужен обычный Mapped Port или Proxy. Но многопоточный.



Digitman   (2001-12-03 16:57) [5]

Не знаю уж, что ты там под "Mapped Port" подразумеваешь. Но классический Proxy-сервер (совершенно неважно, какой уж он там - одно- или многопоточный), "слушая" конкретный порт (читай - реализующий для клиентов некиий конкретный сервис) должен иметь один выход на сервер, реально представляющий требуемый сервис, и много входов, по которым N клиентов одновременно могут требовать у proxy данный сервис. И мультипоточность здесь совершенно ни при чем - выходное гнездо (гнезда) proxy-сервера все равно будут работать в режиме разделения времени между приемом-передачей пакетов разных клиентов proxy-клиентов

Самый классический (и, в целом, нормально работающий) - пример : демо-проект BorlandSocketServer (scktsrvr.dpr)



Иван Мхитаров   (2001-12-03 17:38) [6]

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

Я как полез в scktsrvr.dpr, так там слишком много наворочено:-(



Digitman   (2001-12-03 18:26) [7]

"получает данные от удаленного сервера" - их (эти самые данные) все клиентские доп.потоки на proxy-сервере могут преспокойно получать через один-единственный TClientSocket. Будь их даже 1000 - все равно запросы на прием и передачу пакетов разных клиентов к прокси будут выстроены в очередь к ядру Winsock, осуществляющему коннект с удаленным сервером.
Но, если уж ты решил создавать для каждого клиентского соединения с прокси отдельный TClientSocket, это следует делать не в конструкторе TServerClientThread, а, скорее всего, в событии TServerSocket.OnGetSocket



Иван Мхитаров   (2001-12-03 18:43) [8]

А простенький примерчик можно?
Не такой навороченный, как scktsrvr.dpr.



Digitman   (2001-12-04 08:57) [9]

а какой тебе примерчик-то еще нужен ? все просто же !

proxy-приложение в 1-ю очередь создает TClientSocket и с помощью него пытается установить коннект с удаленным сервером. В случае успеха создается активизируется TServerSocket, тем самым разрешается подключение прокси-пользователей к прокси-серверу (заметь - именно тогда, когда сам прокси-сервер успешно установил соединение с удал.сервером).

Все клиентские запросы в отдельных потоках на прием/передачу данных отныне будут (прямиком или через некий программный фильтр) транслироваться в заранее созданный и подключенный TСlientSocket (арбитраж одновременно вызываемых в разных потоках методов SendBuf/ReceiveBuf объект TСlientSocket осуществляет вполне успешно и без твоего вмешательства)

При возникновении события TСlientSocket.OnDisconnect (равно как и ошибок приема/передачи в сеансе коннекта прокси-сервера с удал.сервером) прокси-сервер должен дезактивировать TServerSocket, отключая при этом собственных активных клиентов из-за невозможности (по факту) дальнейшей связи с удал.сервером



Иван Мхитаров   (2001-12-04 15:46) [10]

Спасибо, у меня все уже получилось.




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.025 c
4-66703           LORN                  2001-12-19 22:13  2002.02.21  
Есть ли у кого - готовая прога ФОРМАТИРОВАНИЕ ДИСКЕТ?


4-66714           Merder                2001-12-22 18:37  2002.02.21  
Видео


6-66635           SemFLY                2001-12-03 23:08  2002.02.21  
Мастера, подскажите, как шифровать траффик между Клиент Сервер


14-66668          SV                    2002-01-01 19:33  2002.02.21  
На злобу дня.


1-66596           Georg                 2002-02-04 18:31  2002.02.21  
TrackBar