首页
论坛
课程
招聘
[原创]解决远控重复上线的源码
2011-4-9 11:12 6147

[原创]解决远控重复上线的源码

2011-4-9 11:12
6147
文章作者:pt007@vip.sina.com
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)

注:文章首发I.S.T.O信息安全团队,后由原创作者友情提交到邪恶八进制信息安全团队技术讨论组。I.S.T.O版权所有,转载需注明作者。
nCnt = m_serverlist.GetItemCount(); //获得当前在线的主机数量
nItem=m_serverlist.InsertItem(nCnt,(_bstr_t)ip,0); //nItem=新增加的记录,nItem值由自动排序生成,所以数值不会顺序生成

if(nCnt>1) //最后一项要大于1
	   { 
		 --nCnt;
		int i2=1;
		//for(Tmpi=nItem;Tmpi<++nItem;Tmpi++ )
        //{//nItem值是随机的,主机上线会自动按IP地址对nItem进行排序
		  //先判断外网IP和主机名称:
			//Tmpi=nItem+1;
			  for(Tmpi=nItem+1;Tmpi<nItem+3;Tmpi++ )
			  {
		    if(m_serverlist.GetItemText(nItem,0 ) == m_serverlist.GetItemText(Tmpi,0)&&m_serverlist.GetItemText(nItem,1) == m_serverlist.GetItemText(Tmpi,1))
			  //if(m_serverlist.GetItemText(nItem,0 ) == m_serverlist.GetItemText(Tmpi,0))
			{
				//MessageBox("Host online repeat!","WARN");
				  // MessageBox(m_serverlist.GetItemText(Tmpi,0));
			
					m_serverlist.DeleteItem(Tmpi); //删除以前的重复IP地址,保留最新的连接
									
				}
				//--Online;
		        nCnt = m_serverlist.GetItemCount();
				temp.Format("Current Online: %d hosts",nCnt);
				AfxGetMainWnd()->SetDlgItemText(IDC_STATIC_1, temp); 
				m_serverlist.Update(0);
			}

[招聘] 欢迎你加入看雪团队!

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 1858
活跃值: 活跃值 (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dalao 活跃值 1 2011-4-9 11:23
2
0
板凳!!!!!!!!!!!!!!!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
oldtom 活跃值 2011-4-9 12:56
3
0
这是垃圾程序,不知道从哪里随便弄一段程序,一点用没有。
而且这段程序烂的很。

解释如下:
如果这段程序是UI线程里面,那么用 Sleep(1) 是个很糟糕的做法。
如果这段程序是后台工作线程,那么 AfxGetMainWnd()->SetDlgItemText(IDC_STATIC_1, temp); 明显是跨线程操作,容易引起界面崩溃。

我估计这个可能是那本书上面摘录下来的。
雪    币: 80
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hardful 活跃值 2011-4-9 14:21
4
0
三楼太犀利了.
跨线程不这样写要如何写才好呢.
雪    币: 33
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PEBOSS 活跃值 2011-4-9 16:00
5
0
那么跨线程刷新界面应该主怎么做呢?
雪    币: 28
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
jackleebug 活跃值 1 2011-4-9 16:34
6
0
工作线程向UI  postmessage  然后工作线程继续往下走 UI收到消息去更新界面 互相不干涉
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
oldtom 活跃值 2011-4-9 21:48
7
0
你好,看到你的留言,由于本人小菜一个无权限在该板块发言,所以发Email咨询一下,忘详细解释。谢谢了先。
如果这段程序是UI线程里面,那么用 Sleep(1) 是个很糟糕的做法。
为什么呢?

hahadazu 网友发过来咨询的,我就在这里做解释了:
通常windows的sleep,最低大概是55ms左右,sleep(1)和sleep(55) 大题上是差不多效果的。
线程在调用sleep之后,那么该线程会进入睡眠状态,停止响应,对于UI线程,他的表现就是停止界面的响应,因为UI线程调用sleep是绝对的大忌。

至于上面提的跨线程刷新界面实现有多种方式,
还有一种方式就是采用共享全局变量,然后在UI线程启用定时器,自动更新之。lz的例子里面的大概意思是需要在界面上面显示一个在线主机的个数,这个数量可能会在工作线程里面进行修改,那么UI线程读取,工作线程写,倒也不冲突,在UI线程里面定时更新下就好。
游客
登录 | 注册 方可回帖
返回