Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
3-66483
masik
2002-01-29 12:21
2002.02.21
MS SQL Types


3-66469
Sava
2002-01-25 12:04
2002.02.21
Как узнать помечена запись на удаление или нет?


3-66459
Дремучий
2002-01-25 16:15
2002.02.21
програмная Referential Integrity?


1-66528
Socol
2002-02-07 04:18
2002.02.21
Dll


6-66646
Mirage
2001-11-08 14:10
2002.02.21
SocketConnection





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский