Netspirit писал(а):
И ещё, что делает точка doClose в TCP_Server? По идее, её вызов должен отключать указанного клиента, но в примере она ничего не делает - клиент может дальше слать данные, а сервер их принимать.С какго перепуга

Разработчик
Ответов: 26192
Рейтинг: 2135
|
|||
Netspirit писал(а): И ещё, что делает точка doClose в TCP_Server? По идее, её вызов должен отключать указанного клиента, но в примере она ничего не делает - клиент может дальше слать данные, а сервер их принимать.С какго перепуга ![]() |
|||
карма: 22 |
|
Ответов: 4638
Рейтинг: 755
|
|||
nesco писал(а): doClose должно закрывать сервер и отсоединять всех клиентовНаверное, для этого служит точка doCloseAll. |
|||
карма: 26 |
|
Разработчик
Ответов: 26192
Рейтинг: 2135
|
|||
Netspirit писал(а): Наверное, для этого служит точка doCloseAll.Но эта точка не уничтожает экземпляр сервера, а только отсоединяет всех клиентов ------------ Дoбавленo в 20.07: Если залезть в дебри, то видно, что отсоединяются все клиенты при уничтожении экземпляра класса по doClose
onCloseAll делает только отсоединение
|
|||
карма: 22 |
|
Ответов: 4638
Рейтинг: 755
|
|||
Тогда почему
nesco писал(а): doClose должно закрывать сервер и отсоединять всех клиентовесли это делает doCloseAll? nesco писал(а): Но эта точка не уничтожает экземпляр сервера, а только отсоединяет всех клиентовВозвращаемся к вопросу "что должна делать точка doClose?". - возьми ExampleInternetTcpTest - нажми "open" у сервера и у клиента - нажми "send" у сервера и у клиента - всё работает - теперь нажми "close" у сервера. После этого "send" у сервера не работает, но "send" у клиента работает. |
|||
карма: 26 |
|
Разработчик
Ответов: 26192
Рейтинг: 2135
|
|||
Netspirit писал(а): Возвращаемся к вопросу "что должна делать точка doClose?".Я же написал, что она должна делать -- уничтожить экземпляр класса с отсоединением всех клиентов ------------ Дoбавленo в 20.12: Netspirit писал(а): если это делает doCloseAll?Ты это чего, эта точка не уничтожает экземпляр сервера, а только отсоединяет клиентов. Млин, но посмотри коды выше |
|||
карма: 22 |
|
Ответов: 4638
Рейтинг: 755
|
|||
Netspirit писал(а): - теперь нажми "close" у сервера. После этого "send" у сервера не работает, но "send" у клиента работаетЗначит, что-то не уничтожает. |
|||
карма: 26 |
|
Разработчик
Ответов: 26192
Рейтинг: 2135
|
|||
Netspirit писал(а): Значит, что-то не уничтожает.Пример мне дай, который не работает, я на него посмотрю |
|||
карма: 22 |
|
Ответов: 4638
Рейтинг: 755
|
|||
Netspirit писал(а): ExampleInternetTcpTest |
|||
карма: 26 |
|
Разработчик
Ответов: 26192
Рейтинг: 2135
|
|||
Странно, действительно не уничтожается, а ведь должен, событие отключения выдает правильно. А Х его З, копать надо код
|
|||
карма: 22 |
|
Ответов: 4638
Рейтинг: 755
|
|||
Да нет, нужно описание к точкам поправить:
doOpen - запускает сервер и разрешает входящие подключения doClose - запрещает входящие соединения (но не отключает уже подключенных клиентов) [offtop]А вообще их нужно было бы обозвать типа doStart/doStop, но это уже невозможно[/offtop] Или пока ничего не менять, но иметь в виду такое поведение. |
|||
карма: 26 |
|
Ответов: 258
Рейтинг: -27
|
|||
а фаервол можно сделать с помощью TCP SERVER ?
![]() ну например на сервере запретить внешний доступ к порту, а через TCP server пропускать весь трафик(в обе стороны). Или такое не получится сделать? |
|||
карма: 0 |
|
Разработчик
Ответов: 26192
Рейтинг: 2135
|
|||
Netspirit писал(а): но не отключает уже подключенных клиентовТы это серверу расскажи, он-то передать клиенту ничего не может, только принимает. Одностороннее соединение какое-то ------------ Дoбавленo в 23.47: Netspirit, ИМХО. Вот так правильно должно быть, но код построен так, что больше экземпляр не создашь. Изначально неправильно реализован алгоритм работы.
Смотри, как это реализовано в TCP_ServerEx
Я так подумал, но чтобы ничего не переделывать и оба сервера работали похожим образом, то можно сделать вот так
|
|||
карма: 22 |
|
Ответов: 4638
Рейтинг: 755
|
|||
Как я понимаю причину глюка:
- TCP_Server создает "серверный" сокет и назначает ему процедуру чтения поступающих данных ![]()
![]()
- поскольку THITCP_Server._work_doClose закрывало только "серверный" сокет, "клиентские" сокеты по прежнему могли вызывать процедуру чтения, так как они уже знали её адрес, а объект, в котором она находится (THITCP_Server) всё ещё существует. Именно поэтому не работала отправка данных сервером ("серверный" сокет, отправляющий данные, закрыт). С чего можно сделать такие выводы: 1) Если принять твою последнюю поправку к THITCP_Server._work_doClose, то также нужно поправить описание к точкам - doClose - отключает всех присоединенных клиентов и запрещает входящие соединения (останавливает сервер) - doCloseAll - отключает всех присоединенных клиентов, но не останавливает сервер 2) Вижу одну реальную задачу, когда может применяться старый подход: если серверу нужно иметь не больше указанного количества клиентов. Тогда: - делается счетчик подключений; если количество равно максимальному, прекращается прием новых подключений, но уже подключенные клиенты продолжают обслуживаться; - делается счетчик отключений; если клиент отключается - сервер опять начинает принимать входящие подключения; Но в этом случае нужно, чтобы по doClose не уничтожался "серверный" сокет, а выставлялся флаг запрета входящих подключений в процедуре приема (то есть, не обрабатывать FD_ACCEPT, но обрабатывать остальные команды). Всё это требует дополнительных тестов, так что твой вариант, наверное, на данный момент более предпочтительный. |
|||
карма: 26 |
|
Разработчик
Ответов: 26192
Рейтинг: 2135
|
|||
Netspirit писал(а): делается счетчик подключенийТак он вроде есть
|
|||
карма: 22 |
|
Ответов: 4638
Рейтинг: 755
|
|||
Это не совсем то. Имелось в виду, что счетчики создаются на уровне схемы по событиях сервера onConnect/onDisconnect. На уровне кода сервера делается только запрет/разрешение входящих подключений в процедуре MWnd(...).
|
|||
карма: 26 |
|