Форум: "Сети";
Текущий архив: 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]Спасибо, у меня все уже получилось.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c