線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:785
推到 Plurk!
推到 Facebook!

也是Thread的問題

尚未結案
luckfox
一般會員


發表:34
回覆:40
積分:24
註冊:2002-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-20 21:20:56 IP:218.32.xxx.xxx 未訂閱
目的:在只有Mac Address的情形下,找出其對應的IP 做法:由於找不到RARP的Solution,所以利用ARP的方法來做將Subnet共分成n個區段,     分別由n個thread去做SendArp的動作,其結果分別儲存在各個Theard和主程式共用的     memory(不得已的方法),而主程式可以去再任何時候去檢查各個thread的IP Resovle的結果    ,主程式讀取任一thread的memory(和主程式共用的),會先將該thread suspended,等到讀取複製完畢,    才將Thread Resume,而Thread 的Create由Timer進行,如果等到所有的thread done後,則重新再Create    thread並執行之        問題:在主程式多次的讀取各個thread後,會當機...請問可能的問題在哪裡   //-----------------thread部分--------------------------------------------------------- __fastcall CPingThread::CPingThread(bool CreateSuspended,TComponent *Owner,DWORD StartIP,DWORD EndIP,DWORD Mask,MacMapTable * MacMapIpTable)         : TThread(CreateSuspended) {   RunningFlag=0;   CPingThread::StartIP=StartIP;//此thread開始作ARP的起始ip   CPingThread::EndIP=EndIP;    //此thread終止作ARP的ip   CPingThread::Owner=Owner;   MacMapIpTable->EntryNumber=0;   CPingThread::MacMapIpTable=MacMapIpTable;//指向和主程式共用的memory } void __fastcall CPingThread::RunSendArp(DWORD SourceIP) {      ULONG umac[2];      ULONG len;      struct   in_addr out;         memset(umac,0xff,8);      len=6;      out.S_un.S_addr=htonl(SourceIP);         IPStr=AnsiString(inet_ntoa(out));         if(SendARP(out.S_un.S_addr,0,umac,&len)==NO_ERROR)      {           mac=(unsigned char *)umac;                        //將獲得的結果存回共用記憶體           MacMapIpTable->MappingEntry[MacMapIpTable->EntryNumber].IP=out.S_un.S_addr;        memcpy(MacMapIpTable->MappingEntry[MacMapIpTable->EntryNumber].MAC ,mac,6);           MacMapIpTable->EntryNumber++;         } } void __fastcall CPingThread::Execute() {      DWORD IndexIP=StartIP;      struct   in_addr  out;         if(RunningFlag>0) return;            RunningFlag++;         while(IndexIP<=EndIP)      {        RunSendArp(IndexIP);           IndexIP++;        if(Terminated) return;      }         RunningFlag--; } //----------------------------thread create--------------------------------- void __fastcall CHostResovle::Ping(AnsiString GUID) {       DWORD StartIP,IndexIP,EndIP,StopIP,IPIncNum;    DWORD dwSize;    IP_ADAPTER_INFO *pAdapterInfo,*pAdapterInfoIndex;    bool FoundFlag=false;    DWORD HostIp,HostMask,SubNet;    int i;    struct   in_addr  out;    bool StopFlag;    CPingThread *ThePingThread;       if(ThreadsDone!=true) return;   //確認IPResovleThreads下已經沒有任何thread在執行       GetAdaptersInfo(NULL,&dwSize);    pAdapterInfo=(IP_ADAPTER_INFO *) new BYTE[dwSize];    //取得此adapter所使用的IP,Mask    if(ERROR_SUCCESS==GetAdaptersInfo((IP_ADAPTER_INFO*)pAdapterInfo, &dwSize))    {       pAdapterInfoIndex=(IP_ADAPTER_INFO*)pAdapterInfo;       while(pAdapterInfoIndex!=NULL && FoundFlag!=true)       {         if(AnsiString(pAdapterInfoIndex->AdapterName)==GUID)         {              HostIp=ntohl (inet_addr(pAdapterInfoIndex->IpAddressList.IpAddress.String));           HostMask=ntohl (inet_addr(pAdapterInfoIndex->IpAddressList.IpMask.String));           if(HostIp!=0) FoundFlag=true;           else break;         } else pAdapterInfoIndex=pAdapterInfoIndex->Next;       }    }    if(FoundFlag==true)    {      ThreadsDone=false;      SubNet=(HostIp & HostMask);         for(IndexIP=HostIp;(IndexIP & HostMask)==SubNet;IndexIP++);         StartIP=SubNet+1;      EndIP=IndexIP-1;      IPIncNum=(EndIP-StartIP)/ThreadNum;         for(i=0;iEndIP) { StopIP=EndIP; } else StopIP=StartIP IPIncNum; PingThread[i]=new CPingThread(false,(TComponent *)this,StartIP,StopIP,HostMask,PingThreadMapTable[i]); PingThread[i]->FreeOnTerminate=true; //auto destory itself when thread finish PingThread[i]->OnTerminate=ThreadTerminal; PingThread[i]->Resume(); ThreadNumber ; StartIP=StopIP 1; } } } void __fastcall CHostResovle::ThreadTerminal(TObject *Sender) { int i,j; CPingThread *MyThread; DWORD ThreadEntryNumber,MasterEntryNumber; MacMappingEntry *MasterMappingEntry,*ThreadMappingEntry; AnsiString MacStr; unsigned char *mac; ThreadNumber--; MyThread=(CPingThread *)Sender; for(i=0;iHandle==MyThread->Handle) { PingThread[i]=NULL; } } //delete if(ThreadNumber==0) { ThreadsDone=true; } } //主程式用來檢視各個thread IP Resovle的結果 void __fastcall CHostResovle::MappingList(ResovleTable *MyResovleTable) { int i,j,k; MacMapTable *MacMapTableRoot; DWORD TheIP; unsigned char *mac; in_addr in; AnsiString MacString,IPString; k=0; for(i=0;iSuspend(); //如果此thread尚未finish,暫停此thread for(j=0;jEntryNumber;j ,k )//將此thread所獲得的IP Resovle結果複製到另一個Record List中 { mac=PingThreadMapTable[i]->MappingEntry[j].MAC; MacString.sprintf("X:X:X:X:X:X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); memcpy(MyResovleTable->Entry[k].Mac,PingThreadMapTable[i]->MappingEntry[j].MAC,6); mac=MyResovleTable->Entry[k].Mac; MacString.sprintf("X:X:X:X:X:X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); MyResovleTable->Entry[k].MacString=MacString; MyResovleTable->Entry[k].Ip=PingThreadMapTable[i]->MappingEntry[j].IP; in.S_un.S_addr=MyResovleTable->Entry[k].Ip; MyResovleTable->Entry[k].IPString=AnsiString(inet_ntoa(in)); } if(PingThread[i]!=NULL) PingThread[i]->Resume(); } MyResovleTable->EntryNumber=k; }
系統時間:2024-05-10 20:54:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!