Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3] 4  Все   Вниз
  Печать  
Автор Тема: Сервер сокетов перестает работать  (Прочитано 78380 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mikl
Постоялец

ru
Offline Offline

« Ответ #60 : 19-06-2011 15:35 » 

AfxSocketInit нет вообще нигде. WSAStartup есть. Естественно не во всех потоках а в основном теле программы один раз - перед созданием объекта класса связи.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #61 : 19-06-2011 15:36 » 

Естественно не во всех потоках а в основном теле программы один раз - перед созданием объекта класса связи.
а надо в каждом потоке. Я натыкался уже на этот фокус
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #62 : 19-06-2011 15:37 » 

А зачем? Если  эти потоки о сокетах вообще понятия не имеют?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #63 : 19-06-2011 15:38 » 

конечно же я имею в виду только те потоки, которые работают с сокетами.
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #64 : 19-06-2011 15:39 » 

Ясно. Нет, дело не в этом.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #65 : 19-06-2011 15:40 » 

Но если дождаться когда связь "отвалится" сама - увы, клиенты подключаются, а данные не ходят ни в одну сторону.
а коды ошибок какие возвращаются ?
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #66 : 19-06-2011 16:05 » 

Нету их. Как ни бредово звучит но....
Сокеты на клиентах открываются, первую команду клиент отсылает, но сервер ее не получает.

Добавлено через 13 часов, 19 минут и 38 секунд:
первая половина эксперимента закончена. Со строками проблем нет. Осталось выяснить с CopyFile.

Добавлено через 1 день, 23 часа, 35 минут и 10 секунд:
Выяснил. Дело именно в CopyFile. Причем т.к. функция выполняется от неск. секунд до минуты для каждого файла (их около 10), то видно что во время ее работы при подключении новых клиентов сокращается выделение памяти.
Есть какие нибудь идеи?
У меня только одна - в функция CopyFile я передаю в качестве параметров объекты типа CString, создаваемые внутри потока. Может создавать их в классе, который вызывает поток?

Добавлено через 1 день, 5 минут и 42 секунды:
Идея не удалась...
« Последнее редактирование: 23-06-2011 05:05 от Mikl » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #67 : 23-06-2011 06:04 » 

Какая идея? Насчет "создавать в классе"?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mikl
Постоялец

ru
Offline Offline

« Ответ #68 : 23-06-2011 06:08 » 

да.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #69 : 23-06-2011 06:22 » 

Причем т.к. функция выполняется от неск. секунд до минуты для каждого файла (их около 10), то видно что во время ее работы при подключении новых клиентов сокращается выделение памяти.

Поясни, пожалуйста, что ты имел в виду.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mikl
Постоялец

ru
Offline Offline

« Ответ #70 : 23-06-2011 06:26 » 

Перед началом копирования в текстовом окне формы выводится надпись "копирование файла такогото....". При окончании копирования или ошибке выводится соотв. надпись - что видно из кода. Естественно что между этими надписями выполняется функция CopyFile.
Так вот поскольку она выполняется довольно продолжительное время на больших файлах, за это время (для теста) успевают подключиться, получить нужные данные и отключиться несколько клиентов. Так вот при этом выделение памяти в диспетчере задач для этого процесса снижается. Если же клиенты подключаются не во время работы CopyFile - такого не происходит.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #71 : 23-06-2011 06:33 » 

Честно говоря, описание не помогает понять происходящее. Попробуй воспользоваться каким-нибудь профайлером, следящим за выделением/освобождением памяти. Возможно есть аномалии.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mikl
Постоялец

ru
Offline Offline

« Ответ #72 : 23-06-2011 06:41 » 

Увы, я не знаю что это такое.
Еще пару дней "плясок с бубном" и просто выкину эту функцию из программы сделав вынос ее во внешнее приложение.

Попробую объяснить подробнее.
Для теста сделано что клиенты подключаются к серверу, получают пол мегабайта данных и отключаются. Делается это весьма быстро.
Если не работает поток в котором вся проблема - то все работает замечательно.
Поток выполняется функция CopyFile запускается раз в 10 минут для копирования файлов из одного места в другое.
Перед началом копирования каждого файла (их около 10) выводится на экран строка "Копирование файла..." и выполняется функция CopyFile.
По окончании работы функции выводится сообщение об успешном или неудачном завершении копирования файла.
Так вот при подключении новых клиентов в интервале когда работает CopyFile, т.е. между выводами сообщений, наблюдается снижение выделенной памяти на несколько килобайт.

Как по другому объяснить я не знаю. И причину тоже понять не могу.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #73 : 23-06-2011 06:49 » 

Стоит ознакомиться с такими инструментами, как профайлеры...
Например, тут есть какие-то: http://en.wikipedia.org/wiki/List_of_performance_analysis_tools#C_and_C.2B.2B
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mikl
Постоялец

ru
Offline Offline

« Ответ #74 : 23-06-2011 06:51 » 

спасибо. Изучу. Хотя врядли в данном случае от меня что зависит - не исправлять же мне CopyFile.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #75 : 23-06-2011 13:41 » 

Думаю, что вероятнее всего дело вовсе не в системной функции. Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mikl
Постоялец

ru
Offline Offline

« Ответ #76 : 24-06-2011 04:57 » 

методом исключений других вариантов не остается
Записан
Phodopus
Интересующийся

ru
Offline Offline

« Ответ #77 : 02-07-2011 12:05 » 

Цитата
В конструкторе/деструкторе класса используются фукнции WSAStartup/WSACleanup.
этот класс в скольких экземплярах создается?

Думаю, что вероятнее всего дело вовсе не в системной функции. Улыбаюсь
согласен с RXL, прислушайтесь

не исправлять же мне CopyFile.
даже при том что вероятность вашей ошибки в ней близка к 0, неужели это так сложно?
Записан
Mikl
Постоялец

ru
Offline Offline

« Ответ #78 : 03-07-2011 14:52 » 

Класс создается в одном экземпляре.
RXL естественно прав. Согласен что дело не в том как работает функция. Дело в том откуда она вызывается.
CopyFile править не думаю по одной причине - на рабочем серваке все работает уже 4 года.

По делу.
Попытка выноса функционала потока во внешний экзешник и пинание его из потка когда надо ни к чему не привела. Вызов Функции ShellExecute приводит к тому же самому. Пока идей нет - буду думать дальше как время появится.
Записан
Mikl
Постоялец

ru
Offline Offline

« Ответ #79 : 25-07-2011 05:19 » 

"Я ...., дорогая редакция" (С)
Путем долгих экспериментов решение проблемы было найдено. Однако причина так и осталась неясна.
Сначала Я вынес функционал по копированию в отдельное приложение, которое запускалось из главного при старте. Не помогло.
Потом я стал это приложение запускать руками. Не помогло.
Дальше пошли совсем уже пляски с бубном. Решилось все элементарно. Если функция копирования в качестве приемника использует диски этой же машины - через 1-3 сутки в приложении сервера начинается падение выделения памяти. Почему пока не разобрался. Но, если копирование осуществляется на сетевой ресурс - все работает без проблем.

Буду разбираться дальше. После выноса всего функционала по копированию в отдельное приложение синхронизация между этим приложением и серверным осуществляется только по файлу-флагу. Если его удается создать заново в приложении, значит база свободна и можно с ней работать. Осуществляется это следующим кодом (одинаковым везде)

try   {DeleteFile(m_pUkaz->FileFlagNameDB);} catch (CFileException){}
HANDLE FileHandleName=CreateFile(m_pUkaz->FileFlagNameDB, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE,NULL,CREATE_NEW,FILE_ATTRIBUTE_HIDDEN,NULL);
if (FileHandleName!=INVALID_HANDLE_VALUE)
{//блокирующий файл создан - работаем с базой
...
}
CloseHandle(FileHandleName);


при этом FileFlagNameDB="\\\\server\\Baza\\TaxiDB.flg"

Так что осталось попробовать поотключать эти блоки или попробовать сделать имя файла локальным.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #80 : 25-07-2011 06:27 » 

try   {DeleteFile(m_pUkaz->FileFlagNameDB);} catch (CFileException){}
опа...

Чем правильно ловить MFC-шные эксепшены:
http://msdn.microsoft.com/en-us/library/e583tzca(v=VS.80).aspx

пример тут
http://msdn.microsoft.com/en-us/library/x2b14fx4(v=VS.80).aspx

А если ловить при помощи try-catch, то случается утечка памяти.
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #81 : 25-07-2011 06:28 » 

спасибо, изучу...

Добавлено через 33 минуты и 13 секунд:
Если я правильно понял то MFC-шные эксепшены надо ловить с помощью TRY, а не try как у меня?
Но в http://forum.sources.ru/index.php?showtopic=49090 написано

"Вопрос. В Visual C++ я видел операторы try и TRY. В чём отличие и чем лучше пользоваться?

Макросы TRY/CATCH/AND_CATCH/END_CATCH/THROW/THROW_LAST тянутся из тех времен, когда компилятор C++ от MS еще не поддерживал стандартную обработку исключений. Пользоваться ли ими – это уже ваш выбор, но в свете сказанного ранее – не советую."

И потом DeleteFile не относится к MFC вроде как? Или CFileException заменить на ...?
« Последнее редактирование: 25-07-2011 07:02 от Mikl » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #82 : 25-07-2011 07:28 » 

Mikl, я не знаю, на чём основана уверенность (вернее - неуверенность) товарисча Бобра. Но я уже сказал, что будет происходить (я прочувствовал это с исключениями CDBException):  объект класса, описывающего исключение, создаётся где-то в глубине классов MFC оператором new, выбрасывается. Если ты его ловишь catch , то никак не производишь возвращение памяти в кучу. С макросами это произойдёт автоматом.

Кроме того, я не знаю, это ли причина у тебя, но по симптомам очень похоже, особенно если исключение часто возникает. Непонятен ещё один момент - как это исключение вообще может произойти в АПИшной функции Улыбаюсь

Тебе тут вообще не нужны исключения, обрабатывай ошибки (GetLastError())
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #83 : 25-07-2011 07:32 » 

>Тебе тут вообще не нужны исключения, обрабатывай ошибки (GetLastError())
Согласен. Обернуто в исключения по принципу "кашу маслом не испортишь".

ну теперь хотя бы есть с чем экспериментировать дальше.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #84 : 25-07-2011 07:35 » 

Mikl, ещё как испортишь, если код будет критическим по скорости Улыбаюсь
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #85 : 25-07-2011 07:37 » 

Это да. Только все что не критично к скорости вынесено в потоки - и там тормозит сколько влезет.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #86 : 25-07-2011 07:42 » 

жуть, какие извращения.
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #87 : 25-07-2011 07:45 » 

Может и так, но я где-то слышал, что настоящий программист не тот у которого в программе нет ошибок, а тот у которого она работает при любом их количестве Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #88 : 25-07-2011 07:50 » 

я ещё слышал, что программисты - ленивые )) А делать поток для якобы исключения тормозов - это как-то.... Нелениво, что ли
Записан

Mikl
Постоялец

ru
Offline Offline

« Ответ #89 : 27-07-2011 08:14 » 

замена try на TRY толку не дала....
Записан
Страниц: 1 2 [3] 4  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines