Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с Accept 
:(
    Опции темы
lollollollol
Дата 28.9.2014, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Пишется приложение на винсок, в определённом месте есть код

Код

      while (connUser<=0) do begin
        sizeU:=SizeOf(clientU);
        connUser:=accept(u,@clientU,@sizeU);
      end;
      while (connUser2<=0) do begin
        sizeS:=SizeOf(clientS);
        connUser2:=accept(s,@clientS,@sizeS);
      end;


Проблема в следующем:
Вначале ожидаем подключения connUser
Пока его ждём, на сокет connUser2 может придти несколько подключений.
Дак вот эти подключения просто ЗАВИСАЮТ. 
т.е. к тому времени когда я получаю connUser, в сокете connUser2 эт подключения возвращаются как -1, но по факту висят открытыми(видн по фаерволу), а когда их набирается более 2к, всё жутко виснет.

Хотя по факту рабочих только 2-4 одновременных подключения.


Вот вопрос, почему подключения, на которые НЕ выполнен Accept остаются висящими, даже если клиент, сделавший запрос уже давно раорвал соединение?

(для тестов соединения делала вторая программа, программу я выключал, а подключения у первой оставались висеть.)
PM MAIL   Вверх
kami
Дата 28.9.2014, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(lollollollol @  28.9.2014,  08:51 Найти цитируемый пост)
в сокете connUser2 эт подключения возвращаются как -1, но по факту висят открытыми

Судя по коду - в сокете s, но не суть. А что при этом скажет WSAGetLastError ?

Это сообщение отредактировал(а) kami - 28.9.2014, 09:38
PM MAIL WWW   Вверх
lollollollol
Дата 28.9.2014, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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, сколько времени оно может висеть активное, т.е. если по каналу не передаётся информация?

Например могу ли я принять подключение, а начать им пользоваться через минуту/час/сутки?
PM MAIL   Вверх
lollollollol
Дата 28.9.2014, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



И ещё вопрос.

Если клиент в неблок. режиме циклично вызывает recv, есть ли какое нибудь ограничение по времени ожидания?


т.е. если я в блок режиме вызываю recv, там время ожидания устанавливается через опции сокета, а как дела с неблок. сокетами?
PM MAIL   Вверх
drkot
Дата 28.9.2014, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(lollollollol @  28.9.2014,  16:21 Найти цитируемый пост)
 как дела с неблок. сокетами?

проверяется текущее состояние буфера без ожидания


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
lollollollol
Дата 28.9.2014, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ты сам понял что написал? вопрос другой - сколько времени подключение будет активно если неблок. режим у сокета. И где это устанавливается.

Не может же оно быть активно вечность.
PM MAIL   Вверх
drkot
Дата 29.9.2014, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(lollollollol @  28.9.2014,  22:57 Найти цитируемый пост)
И где это устанавливается.

в параметрах сокета (через API как и все в винде)

Цитата(lollollollol @  28.9.2014,  22:57 Найти цитируемый пост)
Не может же оно быть активно вечность.

почему бы и нет?

Добавлено через 1 минуту и 28 секунд
А в чем сакральный смысл кода в первом после?
Он сильно попахивает не корректностью....


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
lollollollol
Дата 29.9.2014, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



поясни?

алгоритм такой:
Вначале для первого порта нужно дождаться accept, потом для второго.
т.е. пока ждём первого, часть коннектов не дождавшить accept могут отрубиться ==> в цикле ждём нового.
Ну и с первым тое самое - после второго снова полчаем первый, но часть коннектов в очереди могут отвалиться.

Добавлено через 44 секунды
1. Но как корректно закрыть те подключения, на которые accept не успел сработать? Т.е. они где-то висят, но ниже accept.

PM MAIL   Вверх
drkot
Дата 29.9.2014, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(drkot @  29.9.2014,  09:06 Найти цитируемый пост)
почему бы и нет?

Цитата(lollollollol @  29.9.2014,  12:09 Найти цитируемый пост)
поясни?

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

Цитата(lollollollol @  29.9.2014,  12:09 Найти цитируемый пост)
алгоритм такой:

наверно это как то должно быть разнесено в нити с применением синхронизации
Цитата(lollollollol @  29.9.2014,  12:09 Найти цитируемый пост)
но часть коннектов в очереди могут отвалиться

наверно нужно больше нитей чтобы успевать обрабатывать все?

Цитата(lollollollol @  29.9.2014,  12:09 Найти цитируемый пост)
Но как корректно закрыть те подключения

если не успел, то наверно они уже закрыты, и еще раз закрывать их наверно не надо


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
lollollollol
Дата 29.9.2014, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ты не прав.

Цитата

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


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

Цитата

наверно это как то должно быть разнесено в нити с применением синхронизации

Может быть, но работает как надо, только соединения появляются незакрытые

Цитата

если не успел, то наверно они уже закрыты, и еще раз закрывать их наверно не надо 

А вот тут ты совсем не прав. В принципе это и стало причиной создания этого топика - такие соединения висят, даже если клиент отправивший запрос отключён.
PM MAIL   Вверх
drkot
Дата 30.9.2014, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



Цитата(lollollollol @  29.9.2014,  18:09 Найти цитируемый пост)
ты не прав.

это Ваше субъективное мнение. 
Специально сделал тест... клиент соединяется и и больше ничего не передает. Соединение до сих пор висит.
Цитата(lollollollol @  29.9.2014,  18:09 Найти цитируемый пост)
 а через час попробуешь отправить данные

а нечего передавать в закрытый сокет
Цитата(lollollollol @  29.9.2014,  18:09 Найти цитируемый пост)
соединения появляются незакрытые

в смысле "не"закрытые?
Цитата(lollollollol @  29.9.2014,  18:09 Найти цитируемый пост)
если клиент отправивший запрос отключён

значит сокет закрыт. а если Вы это не проверяете или не контролируете, то от этого он не становится "открытым".

Сокеты работают не зависимо от Ваших религиозных взглядов, и если Вы верите в "открытость" сокета, это еще не значит, что так оно и есть.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 30.9.2014, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 0
Всего: 8



lollollollol,  Лично для Вас


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.