vovksextra
СitizensТип контенту
Профили
Форум
Календарь
Все, що було написано vovksextra
-
Выложил 2.0.1.1 Добавил try except при изменени свойств,методов и при их чтении
-
Выложил 2.0.1.0 Реализована возможность изменять данные пользователя читаем rtf,смотрим в тексте ert и пробуем.
-
Во время непосредственного обновления достаточно сделать кнопки для работы с пользователем (Новый,Редактировать,Удалить) просто неактивными. И при открытии окна редактирования - таймер для автообновления - отключать Что-то типа того.
-
Выложил в 2.0.0.2 читаем readmy.!!!,history.txt
-
К концу недели научу писать все поля кроме нескольких (Login,PingTime,LastCash ........), кроме 6-ти
-
Выложил в "шапке" версию 2.0.0.1 читает все данные пользователя. тестим ))
-
пока не спешите ничего делать пишу полную компоненту
-
Убрал я все вызовы WSACleanup из всех методов класса NETTrans - "затык" остался ((((( значит где-то в другом месте нужно рыть (((
-
Смотри снова первый пост.Перевыложил.
-
Значит так запустил в режиме отладки Обновляется список пользователей в это время мы запускаем изменение параметров затык происходит на вызове int NETTRANSACT::RxHeaderAnswer() здесь мы начинаем принимать данные от сервера. но пока мы до этого дошли произошел где-то раньше nt.disconnect который вызвал WSACleanup. короче в классе NETTRANS нужно избавляться от WSACleanup
-
пардон - согласен, сейчас исходников нету под рукой - но в connect-е поссмотри или вызывается WSACleanup и при каких обстоятельствах в любом случаее это из за этого вызова - глянь
-
WSACleanup() - функция завершает работу программы с библиотекой гнезд Ws2_32.dll. всех гнезд в данном приложении проверь у себя Есть закономерность - жми обновление списка пользователей и пока он обновляется быстренько любому из них добавь некую сумму денег и полезет то о чем писалось потом перенеси nt.disconnect в правильно место и баг исчезнет
-
первое что мы делали пробывали держать открытый сокет и в конфигураторе запустить обновление.процедура обновления "висит",но при освобождении сокета корректно продолжает обновлять список. То-есть запросы на сокет стоят в ожидании и выполняются при достижении своей очереди так как в серверной части используется работа с сокетами в режиме "O_NONBLOCK" для организации многопоточной обработки с сокетами прийдется переделывать очень много кода для каждого соединия создавать свои нити и корректо их обрабатывать - но такая схема сильно усложнит сам код. посему с эти нужно смириться и принаровиться. Теперь стояла задача заставить сервер вываливать сообщение Broken pipe что мы не делали у нас ничего не получилось. И здесь на помощь к нам пришла Ирина, вот она явно заметила когда конфигуратор помирал. А помирал он тогда, когда во время обновления списка она пыталась изменить данные пользователя лезем в коды и что мы видим. int TEditUserForm::SendRequest(list<String> & req) { NETTRANSACT nt; nt.SetServer(settings.server); nt.SetServerPort(settings.serverPort); nt.SetLogin(admin.GetLogin()); nt.SetPassword(admin.GetPassword()); nt.SetRxCallback(UsersParseReply); if (nt.Connect() != st_ok) { admin.LogOut(); MessageDlg(nt.GetError(), mtError, TMsgDlgButtons() << mbOK, 0); return -1; } else { if (nt.Transact(&req) != st_ok) { admin.LogOut(); MessageDlg(AnsiString("Сервер сообщает об ошибке:\n") + AnsiString(nt.GetError()), mtError, TMsgDlgButtons() << mbOK, 0); return -1; } } nt.Disconnect(); return 0; Вызов nt.Disconnect() - происходит в любом случае установили мы соединение с сервером или нет. Но как я сказал раньше в этот момент идет обновление списка,казалось бы что происходит, а происходит следующее: соединение мы не смогли установить и вызывам сразу nt.Disconnect(); смотрим что у нас там int NETTRANSACT::Disconnect() { closesocket(outerSocket); WSACleanup(); return 0; WSACleanup() - функция завершает работу программы с библиотекой гнезд Ws2_32.dll. вот и ответ !!!! Есть два метода решения 1. Метод очередной затычки: int TEditUserForm::SendRequest(list<String> & req) { NETTRANSACT nt; nt.SetServer(settings.server); nt.SetServerPort(settings.serverPort); nt.SetLogin(admin.GetLogin()); nt.SetPassword(admin.GetPassword()); nt.SetRxCallback(UsersParseReply); if (nt.Connect() != st_ok) { admin.LogOut(); MessageDlg(nt.GetError(), mtError, TMsgDlgButtons() << mbOK, 0); return -1; } else { if (nt.Transact(&req) != st_ok) { admin.LogOut(); MessageDlg(AnsiString("Сервер сообщает об ошибке:\n") + AnsiString(nt.GetError()), mtError, TMsgDlgButtons() << mbOK, 0); return -1; } nt.Disconnect(); } return 0; то есть ставим nt.Disconnect(); на свое место. Но такая же фигня может вылезти еще где-то 2. Правильный метод: int NETTRANSACT::Disconnect() { closesocket(outerSocket); // Нужно убрать из метода WSACleanup(); // до сих пор return 0; int NETTRANSACT::Connect() { int ret; // Нужно убрать из конструктора ret = WSAStartup(MAKEWORD(1, 1), &wsaData); if (ret) { strcpy(errorMsg, WSASTARTUP_FAILED); return st_conn_fail; } // до сих пор И теперь разово вызвать эти обе функции - но к сожалению на си Я не знаю где их вставить- но то что их нужно выкинуть из класса - это уж точно на делфе они у меня вставлены в секцию инициализации и финализации соответственно вот часть примера из моего кода ........ procedure TNetTransact.Reset; begin FStream.Clear; end; var WSAData: TWSAData; procedure Startup; var ErrorCode: Integer; begin ErrorCode := WSAStartup($0101, WSAData); if ErrorCode <> 0 then raise Exception.Create('WSAStartup'); end; procedure Cleanup; var ErrorCode: Integer; begin ErrorCode := WSACleanup; if ErrorCode <> 0 then raise Exception.Create('WSACleanup'); end; initialization Startup; finalization Cleanup; end. прошу разработчиков внести эти важные коррективы . И естественно выложить свежий релиз конфигуратора спасибо )))
-
баг найден - готовлю методику исправления. Дело не в listen - он и правду не причем
-
Думаю что res = listen(listenSocket, SOMAXCONN); или res = listen(listenSocket, 16) должно помочь сегодня ночью перекомпилим - завтра скажу
-
совершенно верно )) или просто кто-то долбит порт )) http://local.com.ua/forum/index.php?showtopic=9757&st=135
-
А насчет предложений - разве их здесь кто-то слушает? Постоянно меряемся у кого длинее болт. Хочешь предложений - откажись от текстовых файлов - перейди на бинарные, проблем с поиском не будет - спозиционировался куда нужно и впихнул что нужно. В конце концов откажитесь в финальном релизе от filestorag баг со СТАТАМИ - есть был и будет до тех пор пока вместо поиска баг, будем вести безсмысленный флейм! Посему примите критику, а не отбивайтесь тем что у нас все четко. XML зачем городить? по-поводу XML _ почитай статью умного дядьки http://russian.joelonsoftware.com/Articles/BacktoBasics.html а то весь код конфигуратора (особенно серверной части ) превратили в сплошной парсер !!!! VOP совершенно прав во всем ! И даже насчет подсчета траффика +-15% - он также прав что кому эти цифри нужны.Там они точно не нужны -но найдутся клиенты - которые это увидят! Я как и VOP человек совсем посторонний. просто у нас билинг стоит , но когда мы решили для себя немного расширить его возможности - начали понимать в его далеко не совершенном коде и глючности - но зато авторы кричат что он работает на всех иксах - да мне пофиг что он работает на линксе -мне нужно под фрей сидеть. вот и говрю о недостатках!
-
где-то в коде cfstat.WriteString("RealName", conf.realName); cfstat.WriteString("Group", conf.group); cfstat.WriteDouble("Credit", conf.credit); cfstat.WriteString("TariffChange", conf.nextTariff); прикаждом вызове WriteString внутри процедуры выполянется flush (который постоянно переписыват файл ) - это разве правильно и очень быстро?
-
Сервер не должен завалиться ни при каких входных данных. попробу запустить два конфигуратора с разных машин и одновременно обновить данные !!!!!! по-поводу защиты XML - нужно мне просто сесть потратить свое время и сделать то что ты говришь быть не может. МОЖЕТ ЕЩЕ КАК МОЖЕТ! только давай что-бы это может отобразилось на твоем кармане.ибо сидеть и просто так тебе что-либо доказывать желания нету более.Просто бессмыслица получается и никаких конструктивных решений
-
и еще я считаю совсем не корректно переписывать всегда весь файл при добавлении только одно параметра. int CONFIGFILE::Flush() { fstream f(fileName.c_str(), ios::out); if (!f.is_open()) { error = EIO; return EIO; } it = param_val.begin(); while (it != param_val.end()) { f << it->first << "=" << it->second << endl; it++; } f.close(); return 0; } может там нужно все внимательно пересмотреть ? может баг кроется именно в этом месте? и еще может быть проверить структуру на наличие в ней данных? файл для записи открыли- записали пустоту и закрыли. может еще раз внимательно алгоритм пересмотреть ?
-
Если поссмотреть на код if (newud.phone != ud.phone) { WinToKOI(s_koi, newud.phone.c_str(), PHONE_LEN); char enc[PHONE_LEN * 2 + 1]; Encode12(enc, s_koi); sprintf(str, "<phone value=\"%s\"/>", enc); request.push_back(str); } тогда можно для той-же строки ("/><t = 45) или еще какой нибудь деструктивной сделать Decode21 сделать KOIToWin и вписать в поле и будет тоже самое это я о чем. раз коды открыты и у пользователя есть инструмент доступа к серверной части, то не мешало-бы обезопасить сервер от подобный деяний а искать строчку нету смысла))) можно просто на любой машине открыть сокет outerSocket := socket(PF_INET, SOCK_STREAM, 0); организовать посылку данных в сокет и все, конфигуратор у админа не запустится - это точно !!! Возможно и завалится сервер
-
Для начала нужно подружить скайстар с фрёй ищи HSD - он участвовал в разработке драйвера под скайстар на фрю. Можешь ему в приват стукнуть. скайстар удалось подружить с фрёй (6.2).
-
думаю что рыть коды смысла нету - самый лучший вариант - перейти на работу с СУБД. ибо самим исправить то что нарабатывалось годами - тяжело будет ))
-
1 я не сишник - но в делфе нужно деструктор самому вызывать в файле confiles.cpp описан деструктор но указателья он явно не закрывает или я что-то не понимаю. CONFIGFILE::~CONFIGFILE() { } Я понимаю так создал класс. (в классе отрыл указатель на файл) поработал с ним (произвел записи по указателю) уничтожил класс (закрыл указатель) Опять же подправьте меня если я не прав вдогонку int CONFIGFILE::WriteString(const string & param, const string &val) { param_val[param] = val; Flush(); return 0; } флуш найден )) только непонятный какой-то int CONFIGFILE::Flush() { fstream f(fileName.c_str(), ios::out); if (!f.is_open()) { error = EIO; return EIO; } it = param_val.begin(); while (it != param_val.end()) { f << it->first << "=" << it->second << endl; it++; } f.close(); return 0; }
