Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [BCB6] TUdpSocket - Приложение зависает... Во время проверки программа зависает... 
:(
    Опции темы
MuForum
Дата 29.7.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброе время суток!
Работаю на "Borland C++ Builder 6.0".
Задача: Сделать проверку активности приложения, через каждые 5 секунд.

Компонент TUdpSocket - Вообще не работает, точнее ресивер не работает, а мне именно ресивер и нужен только.
Использовал компонент IdUdpServer, но проблема заключается в том, что иногда при выключение приложения программа зависает, а иногда всё нормально. Я перепробовал 9 способов, и во всех 9 способов был один и тотже исход, то зависает программа, то всё нормально.

P.S. -> Я пробовал делать проверку через поиску по хэндлу(заголовку), по классу хотел, но класс не виден у приложения(скрыт - использовал для обнаружения программу "Process Viewer 4.03"), пробовал ещё многими способами, но полюбому: При выключение программы, которая посылает пакеты по порту 55557(UDP), иногда программа зависает, а иногда всё нормально!

Вот способ, который я сделал и он мне больше всего нравиться.

Код
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 - 30.7.2007, 02:47


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
dumb
Дата 30.7.2007, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 1
Всего: 158



ну и описание... smile ты бы сам понял проблему, прочитав свой пост, если бы не знал о чем речь?
если я правильно понял(что не очень вероятно), у тебя зависает мониторящий сервер(кусок которого ты привел) в момент, когда завершается программа-клиент, которую мониторят?

внимание вопросы:
  •  в чем заключается "зависание"?
  •  чему равно свойство IdUDPServer.ThreadedEvent?
  •  почему не проверяешь сколько пришло - BytesRecved?
  •  зачем эти проверки - 
    Код
    if(Timer1->Enabled!=true) Timer1->Enabled=true;
    if(Edit2->Text!="Offline") Edit2->Text="Offline";
    if(Edit2->Text!="Online") Edit2->Text="Online";
    ?
вообще, очень много избыточного кода, если я правильно понял суть задачи.
PM MAIL   Вверх
MuForum
Дата 30.7.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



#2, dumb - Я извиняюсь, что так непонятно написал, просто весь день вчера за компьютером проторчал и голова уже ночью вообще не варила...

Сейчас постараюсь внятно и доступно всё объяснить!
------------------------------------------------------------------------
Есть приложение "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. -> Вот свойства компонента:
Код

  IdUDPServer1->BroadcastEnable=true;
  IdUDPServer1->ThreadedEvent=false;
  IdUDPServer1->Tag=0;
  IdUDPServer1->BufferSize=8192;


Это сообщение отредактировал(а) MuForum - 30.7.2007, 12:24


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
MuForum
Дата 30.7.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



#for all - Всё я свою проблему решил, она заключалась в том, что я не включил параметр "ThreadedEvent" + в косметике кода.

Но возникла теперь другая проблема, вот сам код:
Код

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" почему-то не обрабатывается, тоесть тупо пропускается =(


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
dumb
Дата 30.7.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 1
Всего: 158



Цитата(MuForum @  30.7.2007,  14:19 Найти цитируемый пост)
она заключалась в том, что я не включил параметр "ThreadedEvent"
нельзя тебе включать ThreadedEvent. я потому и спрашивал насчет него, чтоб удостовериться, что ты его случайно не включил. выключи.

Код

void __fastcall TForm1::IdUDPServer1UDPRead(TObject *Sender,
      TStream *AData, TIdSocketHandle *ABinding)
{
  static char sbuf[256];
  char *buf = sbuf;
  try {
    int size = AData->Size;
    if (size > sizeof(sbuf)) buf = new char[size+1];
    memset(buf, 0, size + 1); // вообще говоря это не нужно
    AData->ReadBuffer(buf, size);
    PacketCore2(buf);
  }
  catch (...) {
    // ошибка.
  }
  if ( buf != sbuf ) delete[] buf;
}

PM MAIL   Вверх
MuForum
  Дата 30.7.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



#5, dumb - Благодарю вас за помощь, сейчас всё работает превосходно!


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.