![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Блокирующий TServerSocket [WinXP]
VaRela © (2007-10-19 12:49:00)Доброе время суток всем, борюсь со следующей проблемой:
TServerSocket работает в блокирующем режиме, создал своего наследника для потока TServerClientThread. В ClientExecute вертится следующий цикл (прошу прощения что BCB):
while (!Terminated && ClientSocket->Connected)
{
.....
}
Цикл работает отлично, но при отключении клиента НЕ ЗАВЕРШАЕТСЯ!,по всей видимости флаг ClientSocket->Connected не сбрасывается, никак не соображу почему.
Как можно узнать что клиент отключился?
P.S. Клиент не мой, переписать не смогу, протокола не знаю. :-)
Сергей М. (2007-10-19 13:29:00) [21]
> VaRela (19.10.07 13:14) [4]
Ради туннеля между всего двумя хостами городить огород с thread blocking режимом сервера, imho, смысла нет.
VaRela (2007-10-19 13:15:00) [22]To Slym
> TServerSocket по умолчание кеширует потоки...
> т.е. поток не терминируется а приостанавливается для дальнейшего
> использования
Да я в курсе, но поток хоть и не разрушается, но всё же должен останавливаться, а в моем случае он крутит цикл пока я не сделаю Server->Close();
VaRela (2007-10-19 13:14:00) [23]
> Не понял .. Как же ты пишешь сервер, если не знаешь протокола
> ? Или ты порт-маппер сочиняешь ?
По сути дела это тоннель, но с обратной логикой, т.е. существует два компьютера, на одном из которых запрещены все входящие соединения, вот на этот компьютер необходимо подключаться, например радмином. Поэтому на этот комп ставится клиентская часть (моя), которая коннектится к моей же серверной части (на втором компе), и устанавливает перманентное соединение, а уже по этому соединению должны передаваться данные в обе стороны. На клиенте так же установлен и серверный сокет, который слушает любые приложения-клиенты и транслирует всё что от них получает в установленное соединение. Ну и в обратную сторону тоже соответственно
> По факту возбуждения исключения при вызове любого из методов
> приема или передачи. В обработчике исключения вызываешь
> ClientSocket.Close и на следующей итерации благополучно
> вываливаешься из цикла.
Хорошая идея кстати, сейчас попробую, большое спасибо за совет :-)
Не уходите далеко, возможно у меня не получится ;-)
Сергей М. (2007-10-19 13:11:00) [24]
> Slym © (19.10.07 13:02) [2]
Это ты к чему ?
Slym (2007-10-19 13:02:00) [25]TServerSocket по умолчание кеширует потоки...
т.е. поток не терминируется а приостанавливается для дальнейшего использования
Сергей М. (2007-10-19 13:00:00) [26]
> Как можно узнать что клиент отключился?
По факту возбуждения исключения при вызове любого из методов приема или передачи. В обработчике исключения вызываешь ClientSocket.Close и на следующей итерации благополучно вываливаешься из цикла.
> переписать не смогу, протокола не знаю
Не понял .. Как же ты пишешь сервер, если не знаешь протокола ? Или ты порт-маппер сочиняешь ?