Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];

Вниз

TServerSocket в режиме stThreadBlocking   Найти похожие ветки 

 
Filin2000   (2002-11-12 15:47) [0]

при работе с TServerSocket в режиме stnonBlocking при отключении клиента проходит событие OnClientDisconect... есть ли что-ниб аналогичное в режиме stThreadBlocking????


 
Digitman   (2002-11-12 16:23) [1]

тебе для каких целей нужно это событие ?


 
Filin2000   (2002-11-12 16:40) [2]

хочется сделать следующее...
на каждого клиента по одному потоку (обработка запросов клиентов может сильно затянуться.. а хочется чтоб в это время короткие запросы других клиентов тоже обрабатывались)... и вот клиент запрос поставил и отключился .... охота откличить Thread


 
Digitman   (2002-11-12 16:52) [3]


> охота


Охота пуще неволи )

О том, что клиент отключился, в этом случае ты узнаешь, получив исключение при попытке вызова любого Send-метода объекта TServerClientWinSocket для возврата результата клиентского запроса. Перехватывай это исключение и немедленно "закругляйся" с выполнением процедуры TServerClientThread.ClientExecute
Все остальное объект TServerSocket сделает сам.


 
Filin2000   (2002-11-12 16:59) [4]

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

и потом... при отключении клиента серверу приходит некий пакет (проверял)... вопрос.. как его отловить???


 
Digitman   (2002-11-12 17:07) [5]

>Filin2000

Давай-ка, чтобы не трепаться впустую, приведи свой существующий вариант тела ClientExecute. Желательно - полный. Я прокомментирую и выскажу свои соображения.


 
Filin2000   (2002-11-12 17:19) [6]

код ничего не даст... :-(

хотя хотельсь бы что-то типа

...
repeat
if ClientSocket.ReceiveLength<>0 then ..что-то делаем

until Terminated or (not ClientSocket.Connected)
...

и вот... когда клиет закрывает соединение то ничего не происходит.. Thread так и прожолжает работать...

вообще как мне кажется должно быть стандартное решение этой проблеммы.. но найти его я никак не могу....


 
Digitman   (2002-11-12 17:32) [7]

стандартное решение (и, пожалуй, самое простое для блок.режима) - одно :

while not Terminated and ClientSocket.Connected do
try
..... все, что угодно
except
on e:ESocketConnectionError do
ClientSocket.Close;
end;


 
Filin2000   (2002-11-12 17:37) [8]

это логично.. но не решает проблемму..
у меня когда клиент отключается свойство ClientSocket.Connected не переходит в false


 
Digitman   (2002-11-12 17:46) [9]


у меня когда клиент отключается


Ка отключается ? Выполняет на своей стороне ClientSocket.Close ? Или - ножницами по сет.кабелю ? Абсолютно разные ж вещи ! И реакция совершенно разная д.б. предусмотрена на штатный и нештатный разрыв транспортного канала


> свойство ClientSocket.Connected
> не переходит в false


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


 
Filin2000   (2002-11-12 17:55) [10]

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


 
Digitman   (2002-11-12 18:02) [11]

для блок.режима - вряд ли

так или иначе, но факт дисконнекта определяется в этом режиме по возврату значения SOCKET_ERROR с WSAGetLastError = WSAECONNRESET или WSAECONNABORTED для вызванной в какой-то момент ф-ции send()/recv()


 
Digitman   (2002-11-12 18:06) [12]

Скажу более : навряд ли, конечно, авторитет Борланда значит что-то для тебя повлияет на твое оконяательное решение, но вот то, что BSS использует именно такой способ корректной обработки штатного дисконнекта - это факт.
Убедись, если хочешь, сам, изучив тело соотв.метода в коде демо-проекта scktsrvr.dpr


 
filin2000   (2002-11-12 18:22) [13]

спасибо... буду копать дальше



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.008 c
1-37040
pumba
2003-01-02 08:14
2003.01.13
Олимпиадная задача 1


3-36982
Che
2002-12-18 23:15
2003.01.13
SELECT


1-37014
Miv
2003-01-01 16:04
2003.01.13
Как с помощью мышки в TlistBox е можно строчки местами менять...?


1-37206
Ramzes
2002-12-31 05:50
2003.01.13
SelfExtractor


3-36969
Pascal_01
2002-12-15 22:33
2003.01.13
Таблицы базы данных





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский