也是Thread的問題 |
尚未結案
|
luckfox
一般會員 發表:34 回覆:40 積分:24 註冊:2002-10-15 發送簡訊給我 |
目的:在只有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;i
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |