Форум » [x]Harbour » Обрыв соединения на SHARED диске ? » Ответить

Обрыв соединения на SHARED диске ?

Andrey: Имею заказчика. У него странная ситуация с моей программой. Сеть из двух компов, сервер (на нем расшаренная папка) и локальная станция. Компы современные, на Win10x64bit Но прога на МиниГуи (Харбор последний) в течении дня несколько раз виснет глухо и всё. Раз 8 за день. Помогает только снятие из диспетчера задач. Соответственно когда прога повисла - из-за чего непонятно, в лог ничего не пишется. Сегодня отловил причину. Кратковременная потеря сетевого соединения ! Вот что в логе: [pre2]Time from start: 0 days 1 hours 32 mins 28 secs Error DBFCDX/1010 Ошибка чтения: \\SERVER\Sklad4.Server\COMMON\NETOPER.DBF (DOS Error 2) --------------------------------- Stack Trace --------------------------------- Called from DBGOTOP(0) [/pre2] Как с этим боротся ? Хотя бы сообщение об ошибки сети получить можно ? Есть ли какие функции для сети. Пробовал при ВИСЯЧЕЙ проге открыть сеть через Проводник, сетевой ресурс открывается. А программа висит... У других моих пользователей таких проблем НЕТ вообще...

Ответов - 53, стр: 1 2 3 All

PSP: Индексы не пробовал пересоздать?

Andrey: При чем тут индексы. Открыты все базы при старте программы. По базе небольшой делаю DBGOTOP() и прога ВИСНЕТ, без сообщения об ошибке. Если захожу в сетевое окружение и пытаюсь открыть Сетевой ресурс, то он открывается. Значит моя прога не смогла прочитать базу и повисла. Почему ?

PSP: Andrey пишет: При чем тут индексы. Может и не при чем. Мое дело - предложить. Не попробуешь - не узнаешь.


Andrey: PSP пишет: Не попробуешь - не узнаешь.

Pasha: Andrey пишет: Хотя бы сообщение об ошибки сети получить можно ? Есть ли какие функции для сети. Все, что можно получить, есть в объекте oError. Можно еще анализировать oError:OsCode Для сети дополнительных функций нет. Причина может быть самая банальная; сервер заснул, или аппаратные проблемы с сетевым оборудованием

Andrey: Pasha пишет: Все, что можно получить, есть в объекте oError Да не доходит до ошибки. Прога тупо висит и всё... потом выдаёт сообщение - программа не отвечает ... Pasha пишет: или аппаратные проблемы с сетевым оборудованием Скорее всего проблемы с сетью... Как отловить это - не знаю... Повесил пока таймер, и каждые 2 минуты открываю маленький dbf на сервере. Буду наблюдать.

Dima: Andrey пишет: Повесил пока таймер, и каждые 2 минуты открываю маленький dbf на сервере. Не проще ли делать PING ?

Pasha: Зависание это или зацикливание, или мееееееднеллная работа некоего неоптимизированного алгоритма, или ожидание отклика системы на что-то, некое событие А ты отловил read error тестовой программой ? Ошибка 1010 не должна возникать никогда, это наверняка аппаратные проблемы

Andrey: Скорее всего, я так думаю нет отклика по сети. Прога работает час-два и тупо подвисает. После перезагрузки опять работает. Что то с сетью случается. Есть функции проверки сети ? Ну там активен ли сетевой ресурс или нет ?

Dima: Andrey пишет: Что то с сетью случается. Галю проверь на сетевой карте , режим экономии лепестричества :) Если стоит снимай

Andrey: Dima пишет: Галю проверь на сетевой карте , режим экономии лепестричества :) Если стоит снимай Спасибо ! Понимаю что у юзера нет админа, но в качестве админа не хочется всегда выступать. Хотелось бы в своей программе пропинговать сетевой ресурс. Есть такое для Харбора ?

Dima: Andrey Вот например http://clipper.borda.ru/?1-4-0-00001343-000-0-0-1622733202

PSP: Андрей, ping помог в твоём вопросе?

Andrey: Ещё не знаю, выходные сейчас.

Andrey: PSP пишет: Андрей, ping помог в твоём вопросе? Хорошая штука. Отлично помог ! Прицепил проверку при длительных операциях и сразу перевел стрелки со своей программы на сеть заказчика. У заказчика связь между компами пропадает, катили бочку на мою программу, сейчас не могут. Для ТСБ по массиву тоже отлично работает, как юзер кнопку тычет, делаю ping сетевого ресурса, ошибку отлично ловит. Пока ещё не сделал ТСБ по базе, хотя тоже надо сделать.

PSP: Andrey пишет: Хорошая штука Да, но есть одно "но") Если на компе, который пингуют (сервер, к примеру). запрещено отвечать на пинги (для серверов это нормально), то будет неверное решение, что комп недоступен. ps. Добавлю, что в случае периодических сбоев сети, пинг тоже то будет, то не будет проходить. Так что, гарантий, как видишь, маловато...

Pasha: Я пару лет назад делал программку, чтобы посмотреть свою же сеть в диапазоне 192.168.1.1 - 255. Использовал вариант с hb_ping Компов много, народ приносит свои ноуты и втыкает в сеть, надо было видеть, что происходит. На части устройств получал ответ: access denied. Видно и телефоны, которые цепляются через wifi роутер

Andrey: Pasha пишет: Я пару лет назад делал программку, чтобы посмотреть свою же сеть в диапазоне 192.168.1.1 - 255. Использовал вариант с hb_ping Было бы интересно посмотреть эту программу.

Dima: Andrey пишет: Было бы интересно посмотреть эту программу. Так Паша пишет Использовал вариант с hb_ping и он у тебя есть , вообще не вижу проблемы На коленке можно написать

Andrey: HB_PING2() и HB_PING() которые здесь есть применимы ТОЛЬКО для BCC 5.8 Мне потребовалось пере собрать свою прогу на BCC 5.5 - облом... прога не собирается из за функции HB_PING [pre2]OBJ\demo2_ping.c: hbping.c: Error E2209 hbping.c 58: Unable to open include file 'icmpapi.h' *** 1 errors in Compile ***[/pre2] Есть ли HB_PING для компилятора BCC 5.5 ? BCC 5.8 не могу у себя использовать, иконки неправильно в программе у меня показывает...

SergKis: Andrey пишет Есть ли HB_PING для компилятора BCC 5.5 ? Может просто воспользоваться ping.exe с протоколом для проверки 0 потерянных блоков, с erroelevel 1 при ошибке и ... usage: ping [-t] [-a] [-n счетчик] [-l размер] [-f] [-i TTL] [-v тип] [-r счетчик] [-s счетчик] [{-j список_узлов | -k список_узлов}] [-w интервал] [имя_конечного_компьютера] PS Проверку вынести на планировщик в периодичность по времени, не загружать свою программу, путь работает bat файл, например, такой (с полей интернета)[pre2] @echo off cls ping racer | find "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)," if not errorlevel 1 set error=success if errorlevel 1 set error=failure cls echo Result: %error% pause [/pre2] Можешь красиво оформить запуск своей программой и сообщать об ошибках, вести лог и т.д. При обнаружении ошибки можешь закрывать свою основную программу

Andrey: Я понял почему мои юзера жалуются на работу моей проги. Если комп ушёл в спящий режим, то после того как юзер его разбудил - локальная сеть и инет какое то время НЕ ДОСТУПНЫ любым программам. Соответсвенно PING из моей программы на сервер не пройдёт !!! Какой механизм в программе можно придумать для исключения таких ситуаций ? Как определить у себя в программе, что программа вышла их спящего режима и повесить задержку чтобы комп проснулся ? Можно окно повесить с сообщением "Комп вышел из спящего режима !"

PSP: Andrey пишет: Если комп ушёл в спящий режим, то после того как юзер его разбудил - локальная сеть и инет какое то время НЕ ДОСТУПНЫ любым программам. Соответсвенно PING из моей программы на сервер не пройдёт !!! БИНГО!!!)))

PSP: Andrey пишет: Какой механизм в программе можно придумать для исключения таких ситуаций ? https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadexecutionstate Как это прилепить к харбору, не подскажу.

Dima: PSP пишет: Как это прилепить к харбору, не подскажу. этот вопрос уже всплывал :)

PSP: Dima пишет: этот вопрос уже всплывал :) А кто задавал?))

Dima: http://clipper.borda.ru/?1-4-0-00001375-000-10001-0-1690466675 Вот тема и некий Andrey там еще и пример свой выложил

PSP: Dima пишет: некий Andrey там еще и пример свой выложил Тогда у него нет проблем

Dima: PSP пишет: Тогда у него нет проблем

Andrey: Dima пишет: Вот тема и некий Andrey там еще и пример свой выложил SergKis пишет: Добавил в пример Андрея Да я не смотрел чем тема завершилась. Занят был и пропустил, а вот и потребовалось тоже.

Dima: Andrey пишет: Error E2209 hbping.c 58: Unable to open include file 'icmpapi.h' Можно пробнуть вот это там нет 'icmpapi.h'

Andrey: Dima пишет: Можно пробнуть вот это Да нет, это не пойдёт, там #include "FiveLinux.ch", выдаёт кучу ошибок. А разве нельзя загрузить DLL из системы и получить ping ? В МиниГуи полно же фишек загрузок системных DLL, типа такого: [pre2]HMG_CallDLL ("GDI32.DLL", HB_DYN_CTYPE_INT, "AddFontResourceEx", cFontFile, FR_PRIVATE+FR_NOT_ENUM, 0) [/pre2]

Andrey: Фиг с этим BCC 5.5, перехожу на BCC 5.8 Решил свою проблему показа иконок. В исходнике который есть, выходит предупреждение. [pre2]OBJ\demo_ping.c: Warning W8084 demo_ping.prg 113: Suggest parentheses to clarify precedence in function hb_Ping2 Исходник: WSADATA wsaData; int iResult; iResult = WSAStartup( MAKEWORD(2, 2), &wsaData ); // строка 113 if( iResult == 0 ) [/pre2] Как его убрать ?

Haz: Andrey пишет: Как его убрать ? Пишет же поставить круглые скобки. Тут разжеван код ошибки W8084 https://www.hardforum.ru/t69116/

Pasha: можно заменить макрос: iResult = WSAStartup( HB_MKUSHORT(2, 2), &wsaData ); или сделать еще проще: iResult = WSAStartup( 0x0202, &wsaData );

Andrey: Haz , Pasha - СПАСИБО ! Отправил примеры с PING Григорию...

Dima: Andrey пишет: Да нет, это не пойдёт, там #include "FiveLinux.ch", выдаёт кучу ошибок. Да , это я маху дал

Andrey: Два разных заказчика жалуются мне что ошибка(окно) по HB_PING2 часто появляется... Админ пишет что с сетью все в порядке, потерь пакетов до сервера нет. А HB_PING2 выдаёт ошибку. Почему ? [pre] IF AT("\\",cPathServer) > 0 cNameServer := SUBSTR(cPathServer,3) cNameServer := SUBSTR(cNameServer,1,AT("\",cNameServer)-1) lRet := HB_PING2(cNameServer) IF ! lRet cMsg := " СЕРВЕР НЕ ДОСТУПЕН !;" cMsg += 'НЕТ доступа к сетевому ресурсу !;' cMsg += cPathServer + ";;" AlertStop( cMsg, "Ошибка доступа" ) lRet := .F. ENDIF ELSE lRet := .T. // это локальный компьютер ENDIF [/pre]

PSP: Andrey пишет: Админ пишет что с сетью все в порядке, потерь пакетов до сервера нет. Ты пингуешь сервер по имени или ip-адресу?

Andrey: По имени - cNameServer := "\\Сервер\ресурс"

PSP: Andrey пишет: По имени - cNameServer := "\\Сервер\ресурс" В функции HB_PING2 (и в HB_PING тоже) из имени сервера путем вызова gethostbyname() получают ip-адрес хоста. Что-то мне кажется, что тут могут быть грабли. К примеру, браузер компьютеров не ответил быстро или в файле hosts вызывающей машины есть соответствующая запись - х.з. Чтобы это всё исключить нужно вызывать HB_PING сразу с ip-адресом.

Andrey: Спасибо БОЛЬШОЕ ! Переделаю и попробую.

PSP: И всё-таки нужно учитывать, что, даже если сервер пингуется, это не даёт гарантии доступности общего ресурса на нем. Пинг - лишь проверка присутствия хоста в сети.

Andrey: PSP пишет: И всё-таки нужно учитывать, что, даже если сервер пингуется, это не даёт гарантии доступности общего ресурса на нем А как проверить что на общем ресурсе можно создать базу ? Попытаться создать простой текстовый файл на нём ? Есть какое то готовое решение с показом ошибок создания/доступа к сетевому ресурсу ?

PSP: Andrey пишет: А как проверить что на общем ресурсе можно создать базу ? Попытаться создать простой текстовый файл на нём ? Думаю, да. Любой, необязательно текстовый)) Создать, записать что-нить, закрыть, проверить размер (или открыть-прочитать), удалить.

SergKis: PSP пишет Создать, записать что-нить, закрыть, проверить размер (или открыть-прочитать), удалить. Только использовать новые файловые ф-ии hb_vf...

PSP: А также можно вспомнить, что есть конструкция BEGIN SEQUENCE <комманды>... [BREAK [<выраж.>]] <комманды>... [RECOVER [USING <переменная>]] <комманды>.. END [SEQUENCE]

Andrey: SergKis пишет: Только использовать новые файловые ф-ии hb_vf... Есть какое то готовое решение с показом ошибок создания/доступа файла на сетевом ресурсе ? Функция dbCreate( cPath + cDbf, aStr ) не создаёт на сетевом ресурсе базу...

SergKis: Andrey пишет Функция dbCreate( cPath + cDbf, aStr ) не создаёт на сетевом ресурсе базу... Только использовать новые файловые ф-ии hb_vf... Для кого было написано PS Ссылки уже давал https://github.com/Petewg/harbour-core/wiki/hb_V http://www.kresin.ru/hrbfaq_3.html#Doc12

Andrey: Не работают... Вот код, случайно пропущен разделить перед файлом: [pre2] ? ProcNL(), hb_vfExists(cDbf), cDbf If !hb_vfExists(cDbf) AlertStop("Нет файла базы !;" + cDbf + ";;" + ProcNL() + ";" + ProcNL(1) ) RETURN .F. ENDIF[/pre2] Вот лог: Вызов из: MYUSEAREA(104) --> util_use.prg .T. \\Сервер\work_uchet\@TEST10test10.dbf

SergKis: Andrey [pre2] IF ( hFile := hb_vfOpen( cFile, HB_FO_CREAT ) ) == NIL // FError() ...ошибка создания, вероятно сервер не доступен ELSE nLen := hb_vfWrite( hFile, "12345") IF nLen != Len("12345") ..ошибка записи ENDIF IF ( lRet := hb_vfClose( hFile ) ) IF !Empty(nRet := hb_vfErase( cFile)) ..ошибка удаления ENDIF ELSE ..ошибка Close ENDIF ENDIF [/pre2]

Andrey: Andrey пишет: Не работают... Вот код, случайно пропущен разделить перед файлом: Блин, промашку дал... В другой папке создался файл. [pre2]Error DBFCDX/1004 Ошибка создания: \\Сервер\work_uchet2\@TEST10\test10.dbf OS Error: 67=Network name not found[/pre2] Есть функция проверки сетевого ресурса ? Или просто проверить папку функцией hb_vfDirExists( cDirName ) ?

PSP: Andrey пишет: \\Сервер\work_uchet2\@TEST10\test10.dbf OS Error: 67=Network name not found http://instcomputer.ru/reshenie-problem/sistemnaya-oshibka-67-ne-najdeno-setevoe-imya.html



полная версия страницы