Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

плиз проверьте

61K
12 октября 2010 года
GanBit
4 / / 23.09.2010
Пишу программу, которая бы отлавливала пакеты из сети. Сниффер находится в отдельном потоке, который постоянно ловит пакеты. Пакеты записываю в класс TBuff, а его уже вTThreadList. После чего основная программа, следит за TThreadList, если не пуст, то начинается работа с пришедшим пакетом, после обработки пакета, пакет удаляется из TThreadList. Ниже представлен код, я его упростил:


Код:
//---------------------------------------------------------------------------
class TBuff
{
private:
 
protected:
 
public:
        unsigned short len,port;
        unsigned short RealBuf[1000];
};
//---------------------------------------------------------------------------
 
class Sniffer : public TThread
{
private:
 
protected:
        void __fastcall Execute();
public:
        DynamicArray <unsigned short> NumPort;
        __fastcall Sniffer(bool CreateSuspended)
      : TThread(CreateSuspended) {}
};
 
//---------------------------------------------------------------------------
 
bool stop1;                  
TThreadList **list=new TThreadList*[65536];
int *PortNum;
Sniffer *Thh;
//-----------------------------------------------------------
void __fastcall Sniffer::Execute()
{
    //в цикле ловит все пакеты
    do
    {
         if (пришел пакет){
           TBuff *BuffObj1=new TBuff;
          BuffObj1->len=длина пакета;
          BuffObj1->port=номер порта;
          memcpy(BuffObj1->RealBuf,буфер с данными,BuffObj1->len);
          list[num]->Add(BuffObj1);
        }
    } while(true);  //постоянно работает
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StartClick(TObject *Sender)
{
   for(int i=0;i<65536;i++)
     list=new TThreadList;
   Thh = new Sniffer(false);                          
   Thh->FreeOnTerminate=true;
   stop1=false;
   do
   {
    for(int i=0;i<65536;i++)
    {
      TList *plist=list->LockList();
      list->UnlockList();
      if (plist->Count!=0)
      {
        TBuff *BuffObj1=(TBuff *)plist->Items[0];
        //.............
        //выполняем действия с BuffObj1
        //.............
        delete (TBuff *)plist->Items[0];
        plist->Delete(0);
      }
    }
   }  while(stop1!=true);
   Thh->Terminate();                      
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::StopClick(TObject *Sender)
{
  stop1=true;
}
//------------------------------------------------------------------------



Правильно ли организовано взаимодействие между нитью и основной программой?
Потокобезопасны ли мои действия?
Правильно ли я использую TThreadList?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог