我用VC6写了一个MFC的远程控制软件,控制端是基于对话框的程序,用CListBox显示和索引所有的被控端IP地址
进来的每个连接都分配一个通信线程,添加和删除ListBox字串用的DeleteString()和InsterString()。
当控制端运行一段时间后,对话框的显示就出问题,好像是什么地方溢出了,莫非是显存?弄了很久都没解决,请高人指点。
如图:
进来的每个连接都分配一个通信线程,添加和删除ListBox字串用的DeleteString()和InsterString()。
当控制端运行一段时间后,对话框的显示就出问题,好像是什么地方溢出了,莫非是显存?弄了很久都没解决,请高人指点。
如图:
//¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö
void AddClt()
{
//µÈ´ý½ÓÊÜsocket£¬from´æ·ÅÇëÇó·½µØÖ·½á¹¹£¬fromlen³¤¶È
sockaddr_in from;
struct timeval rcv_out;
int fromlen=sizeof(from);
SOCKET tmpS=accept(a_server,(sockaddr*)&from,&fromlen); rcv_out.tv_sec=5*60000; //ÉèÖÃrecv³¬Ê±Ê±¼ä(ºÁÃë)
rcv_out.tv_usec=0;
setsockopt(tmpS,SOL_SOCKET,SO_RCVTIMEO,(char*)&rcv_out,sizeof(rcv_out)); CString str,strWhere;
for(int j=0;j<MAXclt;j++)
{
if(client[j].m_Socket==0)
{
client[j].m_Socket=tmpS;
str.Format("\r\nWe have a connect! IP:¡¾%s¡¿",inet_ntoa(from.sin_addr));
client[j].m_addr=from.sin_addr;
SetEdit(a_pEdShowinfo,str);
client[j].n_ID=j; strWhere.Format("%s",inet_ntoa(from.sin_addr));
LocalityFromIP(strWhere);//²éѯµØÀíλÖÃ
str.Format("%d> %s \t",j,inet_ntoa(from.sin_addr));
str+=strWhere;
EnterCriticalSection(&g_cs);
a_pLB->DeleteString(j);
a_pLB->InsertString(j,str);//Ö´ÐÐÍê¼´¸Ä±äÏÔʾÄÚÈÝ
a_curtCltID=-1; a_nConnect++;
LeaveCriticalSection(&g_cs);
//´´½¨½ÓÊÕ¿Í»§¶ËÏûÏ¢µÄÏß³Ì
HANDLE hMan1=CreateThread(NULL,0,ThreadProc_rcv,(LPVOID)&client[j],0,\
(LPDWORD)&Thread_rcv[j]);
CloseHandle(hMan1);
Sleep(400);/* HANDLE hMan2=CreateThread(NULL,0,ThreadProc_snd,(LPVOID)&client[j],0,\
(LPDWORD)&Thread_snd[j]);
CloseHandle(hMan2);
*/
return;
}
}
}//每个IP连接的接收处理线程
//¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö
DWORD WINAPI ThreadProc_rcv(LPVOID param) //paramÊÇÖ¸ÏòsockteTable½á¹¹µÄÖ¸Õë
{
char rcv[B_RCVBUF];
char SourceFile[MAX_PATH],DestFile[MAX_PATH];
int i,len,dirlen,icon,newIconCount,ID;
CString str;
stream in;
SYSTEMTIME oldTime,newTime;
SOCKET *psock;
SHFILEINFO shinfo; in.size=B_RCVBUF;
in.data=(BYTE*)malloc(in.size);
psock=&(*(SocketTable*)param).m_Socket;
ID= (*(SocketTable*)param).n_ID;
PlaySound("IDR_Cnct",AfxGetResourceHandle(),SND_RESOURCE|SND_ASYNC|SND_NODEFAULT);
while(1)
{
//socketµÄ½ÓÊÕ»º³åÇøºÍrecv£¨£©ÀïµÄ»º³åÇø²»Í¬£¬recv²ÎÊýÀïµÄÊÇÎÒÃǶ¨ÒåµÄ¡£
//socketµÄ½ÓÊÕ»º³åÇø²»Îª0£¬recv¾Í·µ»Ø,·µ»ØµÄÊÇÒƵ½ÎÒÃǶ¨ÒårcvÖеĵÄ×Ö½ÚÊý¡£
memset(rcv,0,sizeof(rcv));
len=recv(*psock,rcv,9,0); //×îºó²ÎÊýÈôΪMSG_PEEK£¬Ôò²»Çå³ýºËÐÄ»º³åÇø£¬ËÀÑ»·
if(len==0||len==-1)//
{
str.Format("\r\nIP:¡¾%s¡¿disconnect!",inet_ntoa((*(SocketTable*)param).m_addr));
SetEdit(a_pEdShowinfo,str);
closesocket(*psock);
*psock=0; //½«SOCKET±íÖеÄm_socketÏàÓ¦ÇåÁã
a_pLB->DeleteString(ID);//¸üÐÂÁбí¿ò
str.Format("%d --------",ID);
a_pLB->InsertString(ID,str);
timerK[ID]=1;//»Ö¸´µÚn_ID¸öÁ¬½ÓΪ¿ÉÖ´ÐÐÃüÁî EnterCriticalSection(&g_cs);
a_curtCltID=-1;
a_nConnect--; //¿Í»§Êý¼õ1
LeaveCriticalSection(&g_cs);
free(in.data);
return 1; //Ï̺߳¯Êý·µ»ØÖµÎÞËùν£¬Ö»Òª·µ»Ø£¬Ï߳̾Í×Ô¶¯½áÊø£¡
}
else
{
if(strcmp(rcv,"FILELIST_")==0)
{
SetEdit(a_pEdShowinfo,"\r\n>> ½ÓÊÕĿ¼...\t");
timerK[ID]=1;//»Ö¸´Î¬³ÖÐźÅcommand_iµÄ·¢ËÍ
memset(in.data,0,in.size);
tcp_recv(*psock,&in,sizeof(int));
dirlen=*(int*)(in.data);
if(dirlen==0)
{
continue; //Ŀ¼ÏÂÎÞ¶«Î÷£¬ÊÕµ½¾ÍÊÇ0£»
}
tcp_recv(*psock,&in,dirlen);
//ɾ³ýa_hItemµÄ×ÓÏî,Èô×ÓÏîΪ¿Õ
if(a_pDir_ip->GetItemText(a_pDir_ip->GetChildItem(a_hItem))=="")
a_pDir_ip->DeleteItem(a_pDir_ip->GetChildItem(a_hItem)); //ÊÇĿ¼
while(*(in.p))
{
if(*(char*)in.p=='?')
{
EnterCriticalSection(&g_cs);
//ÔÚ½áµãhItemÉÏÌí¼ÓÏîÄ¿
if(iconK==0)
a_hSubItem=a_pDir_ip->InsertItem((char*)(in.p+sizeof(char)),0,0,a_hItem);
else
a_hSubItem=a_pDir_ip->InsertItem((char*)(in.p+sizeof(char)),1,1,a_hItem);
a_pDir_ip->InsertItem("",a_hSubItem);
LeaveCriticalSection(&g_cs);
}
in.p+=strlen((char*)in.p)+1;
} //ÊÇÎļþ
in.p=in.data;
while(*(in.p))
{
EnterCriticalSection(&g_cs);
if(*(char*)in.p!='?')
{
SHGetFileInfo((char*)(in.p+sizeof(char)), FILE_ATTRIBUTE_NORMAL,
&shinfo,sizeof(shinfo), \
SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON|SHGFI_USEFILEATTRIBUTES); newIconCount=iconCount;
for(i=0;i<newIconCount;i++)
{
if(icontb[i].iIcon==shinfo.iIcon) //ͼ±ê¾ä±úÿ¸öÎļþ¶¼²»Í¬
{
icon=icontb[i].imgID;
break;
}
if(i==iconCount-1)
{
icon=a_img.Add(shinfo.hIcon);
icontb[i].imgID=icon;
icontb[i].iIcon=shinfo.iIcon;
icontb[i+1].iIcon=0;
if(iconCount<100)
iconCount++;
}
}
a_pDir_ip->InsertItem((char*)(in.p+sizeof(char)),icon,icon,a_hItem);
}
LeaveCriticalSection(&g_cs);
in.p+=strlen((char*)in.p)+1;
}
SetEdit(a_pEdShowinfo,"\t\tok!");
iconK++;
} if(strcmp(rcv,"UP_READY_")==0)
{
memset(SourceFile,0,MAX_PATH);
::GetDlgItemText(a_hDlg,IDC_EDIT_Lpath,SourceFile,MAX_PATH);
SendFile(*psock,SourceFile);
} if(strcmp(rcv,"UFILE_OK_")==0)
{
::SetDlgItemText(a_hDlg,IDC_fileOK,"ÉÏ´«³É¹¦!");
Sleep(4000);
::SetDlgItemText(a_hDlg,IDC_fileOK,"");
timerK[ID]=1;
}
if(strcmp(rcv,"UFILE_NO_")==0)
{
::SetDlgItemText(a_hDlg,IDC_fileNO,"ÉÏ´«Ê§°Ü!");
Sleep(4000);
::SetDlgItemText(a_hDlg,IDC_fileNO,"");
timerK[ID]=1;
} if(strcmp(rcv,"DN_READY_")==0)
{
::GetDlgItemText(a_hDlg,IDC_EDIT_Lpath,DestFile,MAX_PATH);
str=DestFile+a_pDir_ip->GetItemText(a_pDir_ip->GetSelectedItem());
if(RecvFile(*psock,str.GetBuffer(1)))
{
::SetDlgItemText(a_hDlg,IDC_fileOK,"ÏÂÔسɹ¦!");
Sleep(4000);
::SetDlgItemText(a_hDlg,IDC_fileOK,"");
}
else
{
::SetDlgItemText(a_hDlg,IDC_fileNO,"ÏÂÔØʧ°Ü!");
Sleep(4000);
::SetDlgItemText(a_hDlg,IDC_fileNO,"");
}
timerK[ID]=1;
} if(strcmp(rcv,"RUNTIMES_")==0)
{
memset(&oldTime,0,sizeof(oldTime));
memset(&newTime,0,sizeof(newTime));
recv(*psock,(char*)&oldTime,sizeof(SYSTEMTIME),0);
recv(*psock,(char*)&newTime,sizeof(SYSTEMTIME),0); str.Format("È⼦ ÏÖÔÚʱ¿Ì: %2dÔÂ%2dÈÕ %2dʱ%2d·Ö%2dÃë\n\nÁ¬½Ó Æô¶¯Ê±¿Ì: %2dÔÂ%2dÈÕ %2dʱ%2d·Ö%2dÃë",\
newTime.wMonth,newTime.wDay,\
newTime.wHour,newTime.wMinute,\
newTime.wSecond,\
oldTime.wMonth,oldTime.wDay,\
oldTime.wHour,oldTime.wMinute,\
oldTime.wSecond);
::MessageBox(a_hDlg,str,"ʱ¼ä¼Ç¼(µ±µØʱ¼ä)",0);
}
if(strcmp(rcv,"RUNTIMES_")==0){}
//next ÅжÏ
}
}
//À뿪
//LeaveCriticalSection(§ion);
free(in.data);
return 1;
}//上面用到的设置Edit空间的函数//¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö¡ö
void SetEdit(CEdit* pEdit,char *param)
{
int nLen=pEdit->GetWindowTextLength();
pEdit->SetFocus();
pEdit->SetSel(nLen,nLen);
pEdit->ReplaceSel(param);
}void SetEdit(CEdit* pEdit,CString param)
{
SetEdit(pEdit,param.GetBuffer(1));//µ÷ÓÃÉÏÒ»¸öº¯Êý
}