摘要:
本文通過例子,介紹了如何在局域網中進行聊天、互發文件以及抓取對方屏幕保存為文件。程序還包括了取得本機和對方的IP、計算機名稱。滾動ListBox控件等功能本人初次發表文章只是想起拋磚引玉之功效,其中錯誤在所難免,請各位看客別拿瓜皮丟我,謝謝。
運行界面如下:
一、 啟動終止監聽線程(只介紹TCP)
由於此程序可以即時切換狀態,因此需要結束仍處於接受狀態的線程。
//TCP監聽線程UINT _ListenTcpThread(LPVOID lparam)
關閉
{
CMyQQDlg *pDlg=(CMyQQDlg *)lparam;
CSocket sockSrvr;
pDlg->m_Potr=PORT+pDlg->m_server;//保存當前使用端口,用於關閉
int createSucceed=sockSrvr.Create(pDlg->m_Potr);
int listenSucceed=sockSrvr.Listen(); //開始監聽
CSocket recSo;
SOCKADDR_IN client;
int iAddrSize=sizeof(client);
int acceptSucceed=sockSrvr.Accept(recSo,(SOCKADDR *)&client,&iAddrSize); //接受連接並取得對方IP
sockSrvr.Close();
char flag[FLAG]={0}; //接受標示,用於判斷接受到的是信息,文件等
if(recSo.Receive(flag,FLAG)!=2)
{
return -1;
}
pDlg->m_type=flag[0];
if(pDlg->m_type==''D'') return 0;//終止此線程
pThreadLisen=::AfxBeginThread(_ListenTcpThread,pDlg);
pDlg->ReceiveFileMsg(recSo,client);
return 0;
}if(m_nSockType==SOCK_TCP)
{
DWORD dwStatus;
if (pThreadLisen != NULL)
{
if(::GetExitCodeThread(pThreadLisen->m_hThread, &dwStatus)==0)
{
int errror=GetLastError();
return;
}
if (dwStatus == STILL_ACTIVE)
{
CSocket sockClient;
sockClient.Create();
CString ip,strError;
ip="127.0.0.1";
int conn=sockClient.Connect(ip, m_Potr);
if(conn==0)
{
AfxMessageBox("關閉錯誤!"+GetError(GetLastError()));
sockClient.ShutDown(2);
sockClient.Close();
return;
}
sockClient.Send("D",FLAG); //結束
}
}
二.發送、接受文件。比較簡單,參看源程序。 發送
for(;;)
接受
{
num=myFile.Read(m_buf, SIZEFILE);
if(num==0) break;//讀文件完畢
end=sockClient.Send(m_buf, num);
}for(;;)
{
n=recSo.Receive(buf,SIZEFILE); //接受
if(n==0) break; //0表示結束
f.Write(buf,n);
}
三、聊天請參看源程序
else if(m_type==''M'') //信息
{
char buff[100]={0};
CString msg;
int ret=0;
for(;;)
{
ret=recSo.Receive(buff,100);
if(ret==0)
break;
msg+=buff;
}
CString strOut,strIn;
m_You_IP.GetWindowText(strIn);
GetNamebyAddress(strIn,strOut);
CString youName;
youName.Format(inet_ntoa(client.sin_addr));
CString str=youName+"<-"+strOut;
AddMsgList(str,msg);
}
四、抓屏,VC知識庫上例子很多,不詳細介紹了。在VC6+Win2000上測試過。
本文配套源碼