typedef struct tagThreadInfo
{
byte a1;
byte a2;
byte a3;
u_short s_ip;
u_short e_ip;
CListCtrl *pl; //列表控件指針
}ThreadInfo;
BOOL bStop; //全局變量
int i_row;void CScanIPDlg::OnScan()
{
//以下取得線程數
char szThread[3];
int ThreadNum;
//m_tread是一個CEdit對象,
m_thread.GetWindowText(szThread,sizeof(szThread));
ThreadNum=10;
if (strlen(szThread)>0) ThreadNum=atoi(szThread);//取得用戶輸入的線程數目
if (ThreadNum<=0 || ThreadNum>30) ThreadNum=10; //對線程數進行限制(1~30) bStop=FALSE;
i_row=0;
ThreadInfo *m_ThreadInfo;
for(int i=0;i<ThreadNum &&(!bStop) ;i++)
{
m_ThreadInfo=new ThreadInfo;
m_ThreadInfo->pl =&m_list;
m_ThreadInfo->hWndIp =GetDlgItem(IDC_STATIC_CURRENT)->GetSafeHwnd();
m_ThreadInfo->a1=(BYTE)192;//a1,a2,a3是指IP地址頭如:192.180.10.xxxx
m_ThreadInfo->a2=(BYTE)168;
m_ThreadInfo->a3=(BYTE)10;
//s_ip與e_ip組成掃描範圍
m_ThreadInfo->s_ip =10;//起始,和IP頭組成192.168.10.10
m_ThreadInfo->e_ip =200;//終止,和IP頭組成192.168.10.200 AfxBeginThread(PingThread,m_ThreadInfo,THREAD_PRIORITY_IDLE);
Sleep(100);
}
}線程函數:
UINT PingThread( LPVOID pParam )
{
ThreadInfo* pThreadInfo = (ThreadInfo*)pParam; CListCtrl *plst=(CListCtrl *)(pThreadInfo->pl);
byte t1,t2,t3;
t1=pThreadInfo->a1;
t2=pThreadInfo->a2;
t3=pThreadInfo->a3;
for(int tmpIp=(pThreadInfo->s_ip);(!bStop) && tmpIp<=(pThreadInfo->e_ip);tmpIp++)
{
CString strIp;
strIp.Format("%d.%d.%d.%d",t1,t2,t3,tmpIp);
plst->InsertItem (i_row,strIp,0);
i_row++;
.........//掃描代碼
}
}問:以上代碼,每個IP地址怎樣只InsertItem一次?
或者說:怎樣修改才能保證每個IP地址只掃描一次.(UP共15分,真正解決問題50分,如果分不夠,另開貼給分)
{
byte a1;
byte a2;
byte a3;
u_short s_ip;
u_short e_ip;
CListCtrl *pl; //列表控件指針
}ThreadInfo;
BOOL bStop; //全局變量
int i_row;void CScanIPDlg::OnScan()
{
//以下取得線程數
char szThread[3];
int ThreadNum;
//m_tread是一個CEdit對象,
m_thread.GetWindowText(szThread,sizeof(szThread));
ThreadNum=10;
if (strlen(szThread)>0) ThreadNum=atoi(szThread);//取得用戶輸入的線程數目
if (ThreadNum<=0 || ThreadNum>30) ThreadNum=10; //對線程數進行限制(1~30) bStop=FALSE;
i_row=0;
ThreadInfo *m_ThreadInfo;
for(int i=0;i<ThreadNum &&(!bStop) ;i++)
{
m_ThreadInfo=new ThreadInfo;
m_ThreadInfo->pl =&m_list;
m_ThreadInfo->hWndIp =GetDlgItem(IDC_STATIC_CURRENT)->GetSafeHwnd();
m_ThreadInfo->a1=(BYTE)192;//a1,a2,a3是指IP地址頭如:192.180.10.xxxx
m_ThreadInfo->a2=(BYTE)168;
m_ThreadInfo->a3=(BYTE)10;
//s_ip與e_ip組成掃描範圍
m_ThreadInfo->s_ip =10;//起始,和IP頭組成192.168.10.10
m_ThreadInfo->e_ip =200;//終止,和IP頭組成192.168.10.200 AfxBeginThread(PingThread,m_ThreadInfo,THREAD_PRIORITY_IDLE);
Sleep(100);
}
}線程函數:
UINT PingThread( LPVOID pParam )
{
ThreadInfo* pThreadInfo = (ThreadInfo*)pParam; CListCtrl *plst=(CListCtrl *)(pThreadInfo->pl);
byte t1,t2,t3;
t1=pThreadInfo->a1;
t2=pThreadInfo->a2;
t3=pThreadInfo->a3;
for(int tmpIp=(pThreadInfo->s_ip);(!bStop) && tmpIp<=(pThreadInfo->e_ip);tmpIp++)
{
CString strIp;
strIp.Format("%d.%d.%d.%d",t1,t2,t3,tmpIp);
plst->InsertItem (i_row,strIp,0);
i_row++;
.........//掃描代碼
}
}問:以上代碼,每個IP地址怎樣只InsertItem一次?
或者說:怎樣修改才能保證每個IP地址只掃描一次.(UP共15分,真正解決問題50分,如果分不夠,另開貼給分)
m_ThreadInfo->pl =&m_list; //m_list是CListCtrl控件變量
下面這句不需考慮
m_ThreadInfo->hWndIp =GetDlgItem(IDC_STATIC_CURRENT)->GetSafeHwnd();
1. 用户输入起始地址字符串ip1, 结束地址字符串ip2,你把这两个地址用inet_addr()转换成两个32bit的ip地址形式,也就是两个长整型 addr1 和 addr2。2. 把addr1 和 addr2 按用户输入的线程数n划分,得到n组范围:
(addr[1] addr[2]) (addr[2]+1, addr[3]),...等等,这些地址是不会重复的。把这些填入struct in_addr结构中的S_addr中,再用inet_ntoa()函数转换成字符串,填入你的结构中就可以了。
ThreadInfo *m_ThreadInfo;
for(int i=0;i<ThreadNum &&(!bStop) ;i++)
{
m_ThreadInfo=new ThreadInfo;
你只有1个指针,但开了ThreadNum个ThreadInfo,
不是要有ThreadNum-1个申请的内存丢了吗?
你又没有释放
ThreadInfo m_ThreadInfo; m_ThreadInfo.pl =&m_list;
m_ThreadInfo.a1=(BYTE)192;//a1,a2,a3是指IP地址頭如: 192.180.10.xxxx
m_ThreadInfo.a2=(BYTE)168;
m_ThreadInfo.a3=(BYTE)10;
//s_ip與e_ip組成掃描範圍
m_ThreadInfo.s_ip =10;//起始,和IP頭組成192.168.10.10
m_ThreadInfo.e_ip =200;//終止,和IP頭組成192.168.10.200for(int i=0;i<ThreadNum &&(!bStop) ;i++)
{
AfxBeginThread(PingThread,&m_ThreadInfo,THREAD_PRIORITY_IDLE);
}換成這樣後,又怎樣修改呢?
然后通过GetDlgItemText取得其输入的字符串,然后通过
Left,Mid,Right获取相应的字段的值并将其转换为整数(atoi);
设置相应的循环即可!
typedef struct tagThreadInfo
{
byte a1;
byte a2;
byte a3;
u_short s_ip;
u_short e_ip;
CListCtrl *pl; //列表控件指針
int id;
int sum;
}ThreadInfo;2. 创建线程时传入id 和 sum for(int i=0;i<ThreadNum &&(!bStop) ;i++)
{
//...
m_ThreadInfo->id=i;
m_ThreadInfo->sum=ThreadNum;
//...
}3. 相应线程搜索指定范围的ip int begin=pThreadInfo->id+pThreadInfo->s_ip;
int end=pThreadInfo->e_ip;
int sum=pThreadInfo->sum;
int i=0;
for(; begin<end; begin+=sum)
{
//...
}
int end=pThreadInfo->e_ip;
int sum=pThreadInfo->sum;
for(; begin<=end; begin+=sum)
{
CString strIp;
strIp.Format("%d.%d.%d.%d",t1,t2,t3,begin);
//..
}
我赞同 “xuying()” 的观点,把IP范围分成N份,N=用户输入的线程数,让每个线程完成各自的IP段,这样每个线程才能高效率运行。