2008年(909)
分类:
2008-05-06 21:40:40
下载源代码
摘要:
本文通过例子,介绍了如何在局域网中进行聊天、互发文件以及抓取对方屏幕保存为文件。程序还包括了取得本机和对方的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上测试过。 下载本文示例代码