![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Пишется приложение на винсок, в определённом месте есть код
Проблема в следующем: Вначале ожидаем подключения connUser Пока его ждём, на сокет connUser2 может придти несколько подключений. Дак вот эти подключения просто ЗАВИСАЮТ. т.е. к тому времени когда я получаю connUser, в сокете connUser2 эт подключения возвращаются как -1, но по факту висят открытыми(видн по фаерволу), а когда их набирается более 2к, всё жутко виснет. Хотя по факту рабочих только 2-4 одновременных подключения. Вот вопрос, почему подключения, на которые НЕ выполнен Accept остаются висящими, даже если клиент, сделавший запрос уже давно раорвал соединение? (для тестов соединения делала вторая программа, программу я выключал, а подключения у первой оставались висеть.) |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 6 Всего: 72 |
||||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Ну дак проблема не в -1, тут как раз ясно всё - клиент отправляет запрос моему приложения, долго время не возникает accept, он отрубается.
Подключение есть в очереди accept, но т.к. клиет уже отключился, возвращает -1. Тут всё верно. Проблема в том, что это соединение ВИСИТ. И на одном порте таких подключений висеть можеть более 2к, не мотря на то что в listen я указал 16. (по идеи очередь не должна быть больше 16 подключений) Добавлено через 5 минут и 44 секунды ВОт только что решил проблему - перевёл сокеты в неолк режим, в цикле гоняю accept, и ненужный отрубаю(Shutdown,closesocket). Всё нормально. На том фоне появились вопросы: Получается из-за того что гоняю в цикле accept, загрузка процессора большая. Поэтому всё таки хочется отказаться от этого метода. 1. Но как корректно закрыть те подключения, на которые accept не успел сработать? Т.е. они где-то висят, но ниже accept. 2. Если оставить неблок. сокеты, вот те подключения, который возвращает accept, нужно вручную переводить в блок режим, т.к. наследуют состояние родителя? Это нормально будет работать? (работа с сокетами нужна именно в блок. режиме) Добавлено через 7 минут и 57 секунд И ещё вопрос, после того как я принял подключение Accept, сколько времени оно может висеть активное, т.е. если по каналу не передаётся информация? Например могу ли я принять подключение, а начать им пользоваться через минуту/час/сутки? |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
И ещё вопрос.
Если клиент в неблок. режиме циклично вызывает recv, есть ли какое нибудь ограничение по времени ожидания? т.е. если я в блок режиме вызываю recv, там время ожидания устанавливается через опции сокета, а как дела с неблок. сокетами? |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
проверяется текущее состояние буфера без ожидания -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
ты сам понял что написал? вопрос другой - сколько времени подключение будет активно если неблок. режим у сокета. И где это устанавливается.
Не может же оно быть активно вечность. |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
в параметрах сокета (через API как и все в винде) почему бы и нет? Добавлено через 1 минуту и 28 секунд А в чем сакральный смысл кода в первом после? Он сильно попахивает не корректностью.... -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
поясни?
алгоритм такой: Вначале для первого порта нужно дождаться accept, потом для второго. т.е. пока ждём первого, часть коннектов не дождавшить accept могут отрубиться ==> в цикле ждём нового. Ну и с первым тое самое - после второго снова полчаем первый, но часть коннектов в очереди могут отвалиться. Добавлено через 44 секунды 1. Но как корректно закрыть те подключения, на которые accept не успел сработать? Т.е. они где-то висят, но ниже accept. |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
если ожидание на сокете стоит бесконечность, то они и не будет принудительно закрыт. При этом на протокольном и(или) канальном уровне будут бегать технические данные для проверки наличия соединения. наверно это как то должно быть разнесено в нити с применением синхронизации наверно нужно больше нитей чтобы успевать обрабатывать все? если не успел, то наверно они уже закрыты, и еще раз закрывать их наверно не надо -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| lollollollol |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
ты не прав.
нет там такого. ты если ничего слать не будешь, а через час попробуешь отправить данные, ошибкой звершится. Чтобы это работало, нужно гонять хотябы по байтику в минуту.
Может быть, но работает как надо, только соединения появляются незакрытые
А вот тут ты совсем не прав. В принципе это и стало причиной создания этого топика - такие соединения висят, даже если клиент отправивший запрос отключён. |
||||||
|
|||||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
это Ваше субъективное мнение. Специально сделал тест... клиент соединяется и и больше ничего не передает. Соединение до сих пор висит. а нечего передавать в закрытый сокет в смысле "не"закрытые? значит сокет закрыт. а если Вы это не проверяете или не контролируете, то от этого он не становится "открытым". Сокеты работают не зависимо от Ваших религиозных взглядов, и если Вы верите в "открытость" сокета, это еще не значит, что так оно и есть. -------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
| drkot |
|
|||
![]() Ищущий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1042 Регистрация: 5.5.2006 Репутация: 0 Всего: 8 |
lollollollol, Лично для Вас
-------------------- Ошибка не становится истиной по причине широкого распространения, как и Истина не становится Ошибкой из-за того, что никто её не видит. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |