Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623

Если завершить процесс клиента, сервер продолжает "считать", что клиент подключен

09.09.2014, 22:47. Показов 1716. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Запустил TCP сервер, который ровно ничего (пока) не делает.
Другим приложением подключился, все хорошо, но если я подключаюсь к серверу и убиваю процесс клиента, то на сервере выползает эта ошибка, и в итоге сервер думает что клиент все еще подключен, закрываю сокет принудительно:

C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::SockClientError(TObject *Sender, TCustomWinSocket *Socket,
          TErrorEvent ErrorEvent, int &ErrorCode)
{
    if (ErrorCode == 10053)
    {
        Socket->Close(true);
        return;
    }
}
Но Socket->ActiveConnections показывает что клиент все еще на месте, хотя я вроде как закрыл это соединение принудительно...
Перебираю все конекты:
C++
1
2
for(int i = 0; i < Sock->Socket->ActiveConnections; i++)
    if (Sock->Socket->Connections[i]->Connected == false)   Sock->Socket->Connections[i]->Close(true);
Результат тот же Socket->ActiveConnections показывает что из всех, кто подключался до сих пор активны, если я при этом еще раз соединюсь клиентом и закрою соединения как положено, то он уже правильно показывает, однако все предыдущие конекты он показывает как все еще активные...
В чем беда? И как сделать чтобы мне выпадало это окошко с ошибкой?

Добавлено через 4 минуты
И эти мертвые души остаются якобы активными пока я не закрою сокет, после он нормально показывает 0

Добавлено через 2 часа 29 минут
поменял Socket->Close(true); на Socket->Close(false);
И теперь конекты сбрасываются.
А как ограничить число подключений к сокету с 1 IP ?

Попробовал следующее:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::SockClientConnect(TObject *Sender, TCustomWinSocket *Socket)
{
    int c = 0;
    for(int i = 0; i < Sock->Socket->ActiveConnections; i++)
        if (Sock->Socket->Connections[i]->RemoteAddress == Socket->RemoteAddress)   c++;
    if (c > Sock_max_con_ip)    {Socket->Close(false);return;}
}
// Sock_max_con_ip = 2
Соединения по сути отваливается сразу же после конекта, но если соединятся быстро, по 500 - 1500 соединений в секунду к серверу, то он заметно начинает кушать CPU однако не падает, можно ли это считать защитой от DoS атаки или все же нужно встать за фаервол ?

Так и не решил проблему: как мне исключение "socket error 10053" обработать? чтобы он мне не плодил эти окошки с ошибкой ..

Добавлено через 4 часа 30 минут
Решил обрабатывать все исключения через TApplicationEvents. Вопрос решен
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2014, 22:47
Ответы с готовыми решениями:

Pascal. Sockets. Узнать IP клиента, если сервер запущен на компьютере, который подключен к роутеру
Добрый день. Написал код (Freepascal, PascalGUI), в котором сервер работает через роутер с белым IP, а клиент подключается из...

Сервер на PHP + клиент на C#. Организовать процесс обмена данными клиента через PHP на сервере
Всем привет. Подскажите, как реализовать. Сейчас есть: сервер и клиент на C#. На сервере есть веб-сервис, который использует клиент...

Почему если клиент-сервер c 127.0.0.1 запускаю на WINDOWS через MS Visual, то после запуска клиента всё пропадает
а если тот же код запускаю в LINUX, то всё проходит нормально

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2014, 22:47
Помогаю со студенческими работами здесь

Как отправить json с клиента на сервер (клиент - прога на C#, сервер - файл PHP)
На хостинге есть файл php, как мне отправить к этому файлу json c помощью C# и как получить его с помощью php? А также как мне отправить,...

TCP Клиент-Сервер.При передачи данных с клиента на сервер происходит зацикливание
Я пишу TCP клиент-сервер в котором сервер отправляет клиенту путь к ТЕКСТОВОМУ файлу.Если у клиента есть этот файл то он начинает...

Если процесс найден то завершить скрипт
Всем привет! Извиняюсь что такую простую вещь спрашиваю. Нужен код для vbs который однократно проверял, запущен ли процесс biz.exe и...

Клиент-сервер, передать строку с клиента на сервер
Подскажите плиз Есть код он передает серверу то что мы пишем с клавиатуры а как передать строку без использования клавиатуры чет...

Какое возникает событие, если завершить процесс приложения
Доброго времени суток. Подскажите, какое возникает событие, если приложение завершит в процессах? Приложение консольное.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru