Доброе время суток! Работаю на "Borland C++ Builder 6.0". Задача: Сделать проверку активности приложения, через каждые 5 секунд. Компонент TUdpSocket - Вообще не работает, точнее ресивер не работает, а мне именно ресивер и нужен только. Использовал компонент IdUdpServer, но проблема заключается в том, что иногда при выключение приложения программа зависает, а иногда всё нормально. Я перепробовал 9 способов, и во всех 9 способов был один и тотже исход, то зависает программа, то всё нормально. P.S. -> Я пробовал делать проверку через поиску по хэндлу(заголовку), по классу хотел, но класс не виден у приложения(скрыт - использовал для обнаружения программу "Process Viewer 4.03"), пробовал ещё многими способами, но полюбому: При выключение программы, которая посылает пакеты по порту 55557(UDP), иногда программа зависает, а иногда всё нормально! Вот способ, который я сделал и он мне больше всего нравиться. Код (Text): TDateTime JStime; // Глобальная переменная. int JSUpdateWrite=0; // Глобальная переменная. int JSErrorWrite=0; // Глобальная переменная. //--------------------------------------------------------------------------- #define MAXBUF2 32767 // Main.h //--------------------------------------------------------------------------- void __fastcall TForm1Main::IdUDPServer1UDPRead(TObject *Sender, TStream *AData, TIdSocketHandle *ABinding) { char buf[MAXBUF2]; ZeroMemory(&(buf[0]), MAXBUF2); int bsize = IdUDPServer1->ReceiveBuffer(&(buf[0]), MAXBUF); buf[bsize]=0; // добавление завершающего нуля. PacketCore2(LPBYTE(buf)); } //--------------------------------------------------------------------------- void __fastcall TForm1Main::PacketCore2(LPBYTE Packet) { int sub; if(*(Packet)==0xC1) { int Head = *(Packet+2); switch(Head) { case 0x01: UpdateServerLoad(Packet); if(ServersLoaded==0) { WriteLogs2("Servers Loaded!", 0); ServersLoaded=1; } break; case 0x02: if(JSUpdateWrite==0) { WriteLogs2("JoinServer update complate.", 0); JSUpdateWrite=JSUpdateWrite+1; if(Timer1->Enabled!=true) Timer1->Enabled=true; } JStime=Time(); break; default: break; } } } //--------------------------------------------------------------------------- void __fastcall TForm1Main::Timer1Timer(TObject *Sender) { TDateTime CurrentTime1; ReplaceTime(CurrentTime1,JStime); TDateTime CurrentTime2 = Time(); TDateTime CurrentTime4 = 0.00006; // Это 5 секунд! (0:00:05) TDateTime CurrentTime3 = CurrentTime2 - CurrentTime1; WriteLogs2("JS Time: "+CurrentTime3, 0); if(CurrentTime3 > CurrentTime4) { if(Edit2->Text!="Offline") Edit2->Text="Offline"; JSUpdateWrite=0; if(JSErrorWrite==0) { WriteLogs2("Time Out JoinServer - Connected false.", 1); JSErrorWrite=JSErrorWrite+1; } Timer1->Enabled=false; } else { if(Edit2->Text!="Online") Edit2->Text="Online"; JSErrorWrite=0; } } //--------------------------------------------------------------------------- P.S. -> Компилирую как "Release", а не как "Full Debug". (Project -> Options -> Compiler -> Release). P.S. -> Прошу людей, кто разбирается в таких делах помочь, так как я уже около недели мучаюсь и не могу выявить проблему =(
MuForum Компонент TClientSocket\TServerSocket нормально отрабатывает, для большинства задач он самое то! Ты же не собираешься писать высконагруженный тулз, каким является апач или NginX, так что думаю на TClientSocket самое то!
#2, EvilsInterrupt - Мне необходим пока компонент для работы с UDP протоколом, а не TCP/IP! P.S. -> Если TClientSocket\TServerSocket можно использовать и для UDP протокола, то поправьте!
Сейчас постараюсь внятно и доступно всё объяснить! ------------------------------------------------------------------------ Есть приложение "JoinServer.exe" (Эта не моя программа), JS посылает 2 пакета в секунду по порту 55557(UDP). JS отправляет пакет в 8 байт, вот такого формата: "\xC1\x08\x02\xF1\x00\x00\x00\x00". Есть другая программа ConnectServer.exe(Моя программа), CS должен принимать этот пакет по порту 55557(UDP), Обрабатывать и если заголовок этого пакета(3 байт) равен "0x02", то тогда показывать статистику и делать другие действия! P.S. -> Как я реализовал это: Когда приходит пакет по порту 55557(UDP), дальше этот пакет передаётся функции "PacketCore2", если 3 байт пакета строго равен "0x02", то это пакет статистики JS, в этот момент запоминается время прибытия пакета(Записывается в глобальную переменную "JStime"). Дальше каждые 5 секунд срабатывает таймер, и там уже условия: Если данное время минут время "JStime" больше 5 секунд, значит JS сейчас не доступен! Вопрос: В чем заключается "подвисание"? Ответ: Программа покрывается белым фоном и с ней не возможно работать(В Диспетчере пишется: Не отвечает). P.S. -> ConnectServer.exe - Это одностороннее приложение! (JoinServer.exe был написан не мной) Но проблема в том, что при закрытие JoinServer.exe моя программа(ConnectServer.exe) иногда подвисает(пока обратно не включить JS или вырубить процесс), а иногда всё нормально. Вот и возникает вопрос, где я допустил ошибку?! P.S. -> Вот свойства компонента: Код (Text): IdUDPServer1->BroadcastEnable=true; IdUDPServer1->ThreadedEvent=false; IdUDPServer1->Tag=0; IdUDPServer1->BufferSize=8192;
#for all - Всё я свою проблему решил, она заключалась в том, что я не включил параметр "ThreadedEvent" + в косметике кода. Но возникла теперь другая проблема, вот сам код: Код (Text): void __fastcall TForm1Main::IdUDPServer1UDPRead(TObject *Sender, TStream *AData, TIdSocketHandle *ABinding) { char buf[MAXBUF2]; ZeroMemory(&(buf[0]), MAXBUF2); int bsize = IdUDPServer1->ReceiveBuffer(&(buf[0]), MAXBUF); buf[bsize]=0; // добавление завершающего нуля. PacketCore2(LPBYTE(buf)); } //--------------------------------------------------------------------------- void __fastcall TForm1Main::PacketCore2(LPBYTE Packet) { int sub; if(*(Packet)==0xC1) { int Head = *(Packet+2); switch(Head) { case 0x01: UpdateServerLoad(Packet); if(ServersLoaded==0) { WriteLogs2("Servers Loaded!", 0); ServersLoaded++; } break; case 0x02: if(JSUpdateWrite==0) { WriteLogs2("JoinServer update complate.", 0); JSUpdateWrite++; if(!Timer1->Enabled) Timer1->Enabled=true; } JStime=Time(); } } } //--------------------------------------------------------------------------- Проблема заключается в том, что теперь какой первый пакет пришел, то только он и обрабатывается почему-то =( Тоесть: Если первый пакет пришел с 3 байтом "0x01", то только он и обрабатывается, а пакет с 3 байтом "0x02" почему-то не обрабатывается, тоесть тупо пропускается =(