◆◆◆ 作者 ◆◆◆
◆◆◆ 日期 ◆◆◆
2012-04-15 16:44:13
◆◆◆ 开发平台◆◆◆ VC++ 6.0 (MFC)
◆◆◆ 运行环境 ◆◆◆ Windows XP
本程序分别运用TCP与UDP连接方式对通讯程序功能进行实现。具体功能为:可以实现像QQ一样的通过网络互发文件、抓取对方屏幕并保存。程序还可以取得对方和本机的IP地址、计算机名和文字太多时出现ListBox控件滚动条等功能。
由于功能上(非界面上)类似QQ的的程序,所以部分功能参考的类QQ程序源码。
程序开始时的运行截图:
设置项目为:
功能项目为:
抓取对方屏幕
显示IP
开始时是默认显示的自己的IP地址,为亮色可修改 选择服务选择设置后,启动变为灰色目的显示对方IP
发送信息
默认为:你好PC--20120224BAZ! 可随意
显示信息
传输文件
一台计算机测试时。
开始运行必须有台主机为服务器选择后有(这里以TCP方式为例)
然后另一台为客户端。
之所以不能一台计算机两个客户端,原因是:两个IP相同。
*注意*:
不同计算机测试时,都关闭防火墙。
这里开始解释程序中的代码。
由于此程序所有互动都是基于对话框上空间进行的,所以几乎所有代码都将从这个CMyQQDlg类中生成的。
◆◆◆ 线程 ◆◆◆
◆◆◆ 服务器线程开始 ◆◆◆
//TCP监听线程
UINT _ListenTcpThread(LPVOID lparam) {
CMyQQDlg *pDlg=(CMyQQDlg *)lparam; if(pDlg->StopServer==true) return -1;
CSocket sockSrvr;
pDlg->m_Potr=PORT+pDlg->m_server;//保存当前使用端口,用于关闭
int createSucceed=sockSrvr.Create(pDlg->m_Potr); if(createSucceed==0) { AfxMessageBox(\"_ListenTcpThread Create错误!\"+pDlg->GetError(GetLastError()));
return -1; }
int listenSucceed=sockSrvr.Listen(); //开始监听 if(listenSucceed==0) { AfxMessageBox(\"_ListenTcpThread Listen错误!\"+pDlg->GetError(GetLastError()));
return -1; }
CSocket recSo;
SOCKADDR_IN client; int iAddrSize=sizeof(client); int acceptSucceed=sockSrvr.Accept(recSo,(SOCKADDR *)&client,&iAddrSize); //接受连接并取得对方IP
if(acceptSucceed==0) { AfxMessageBox(\"_ListenTcpThread Accept错误!\"+pDlg->GetError(GetLastError()));
return -1;
}
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; }
UINT _UDPThread(LPVOID lparam) /////UDP接受信息线程开始 {
CMyQQDlg *pDlg=(CMyQQDlg *)lparam; if(pDlg->StopServer==true) return -1;
CSocket sockSrvrUdp;
sockSrvrUdp.Create(PORT+pDlg->m_client,SOCK_DGRAM); char buff[100]={0}; int ret=0; CString ipStr; CString msg; UINT port; for(;;) { ret=sockSrvrUdp.ReceiveFrom(buff,100,ipStr,port);//IP和port均为返回值
if(buff[0]=='D') return 0; if(ret==SOCKET_ERROR) { break; } msg.Format(buff);
pDlg->AddMsgList(ipStr,msg); }
sockSrvrUdp.Close(); return 0; }
////////////////////////////////////服务器线程结束//////////////////////////////////////
◆◆◆ 客户端线程开始 ◆◆◆
//发送文件线程
UINT _SendFileThread(LPVOID lparam) {
CMyQQDlg *pDlg=(CMyQQDlg *)lparam; if(pDlg->StopServer==true) return -1;
CSocket sockClient; sockClient.Create(); CString ip;
pDlg->m_You_IP.GetWindowText(ip);
sockClient.Connect(ip, PORT+pDlg->m_client); //首先发送标记F为文件,2 int end=0;
end=sockClient.Send(\"F\
///////////////////////////////////////////////////////////////////发送标志是否成功 if(end==SOCKET_ERROR) { AfxMessageBox(\"_SendFileThread Send误!\"+pDlg->GetError(GetLastError()));
return -1; }
else if(end!=2) { AfxMessageBox(\"文件头错误\"); return -1; }
/////////////////////////////////////////////////////////////////// CFile myFile;
FILEINFO myFileInfo;
if(!myFile.Open(pDlg->m_fileName, CFile::modeRead CFile::typeBinary))
错
|
);
return -1;
myFileInfo.fileLength=myFile.GetLength(); //得到文件大小 strcpy(myFileInfo.fileName,myFile.GetFileName());//得到文件名称
sockClient.Send(&myFileInfo,sizeof(myFileInfo)); //发送文件信息
pDlg->m_Progress.SetRange32(0,myFileInfo.fileLength);
myFile.Seek(0,CFile::begin); char m_buf[SIZEFILE]={0}; CString strError; int num=0; end=0; int temp=0;
pDlg->GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(true
;
for(;;) { if(pDlg->FileWork==false) { pDlg->FileWork=true; pDlg->GetDlgItem(IDCANCEL)->EnableWindow(false);
pDlg->GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(false)
} num=myFile.Read(m_buf, SIZEFILE); if(num==0) break; end=sockClient.Send(m_buf, num); temp+=end; pDlg->m_Progress.SetPos(temp); if(pDlg->FileStop==true) { pDlg->FileStop=false; pDlg->FileWork=false; break; } if(end==SOCKET_ERROR) { AfxMessageBox(\"_SendFileThread 误!\"+pDlg->GetError(GetLastError()));
break;
Send错
} }
pDlg->m_Progress.SetPos(0); CString strLocalName;
pDlg->GetLocalHostName(strLocalName); CString strLocalIP;
pDlg->GetIpAddress(strLocalName,strLocalIP); if(temp==myFileInfo.fileLength) pDlg->AddMsgList(strLocalIP+\"->\"+strLocalName,\"文件发送成功\");
else pDlg->AddMsgList(strLocalIP+\"->\"+strLocalName,\"文件发送失败\");
myFile.Close(); sockClient.Close(); pDlg->FileWork=false;
pDlg->GetDlgItem(IDC_PROGRESS_SEND_FILE)->ShowWindow(SW_HIDE);
pDlg->GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(false);
pDlg->GetDlgItem(IDCANCEL)->EnableWindow(true);
pDlg->GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(true);
return 0; }
UINT _SendMsgThread(LPVOID lparam) //TCP发送信息线程 {
CMyQQDlg *pDlg=(CMyQQDlg *)lparam; if(pDlg->StopServer==true) return -1;
CSocket sockClient; sockClient.Create(); CString ip,strError;
pDlg->m_You_IP.GetWindowText(ip);
int conn=sockClient.Connect(ip, PORT+pDlg->m_client); if(conn==0) /////////////////////////////////// {
AfxMessageBox(\"_SendMsgThread Connect误!\"+pDlg->GetError(GetLastError()));
sockClient.ShutDown(2); sockClient.Close(); AfxEndThread(1L); return 0; }
//首先发送标记M为信息,2 int end=0;
end=sockClient.Send(\"M\ if(end==SOCKET_ERROR) { AfxMessageBox(\"_SendMsgThread Send误!\"+pDlg->GetError(GetLastError()));
return -1; }
else if(end!=2) { AfxMessageBox(\"消息头错误\"); return -1; }
CString strMsg=pDlg->m_MsgSend;
end=sockClient.Send(strMsg,strMsg.GetLength()); if(end==SOCKET_ERROR) { AfxMessageBox(\"_SendMsgThread Send误!\"+pDlg->GetError(GetLastError()));
return -1; }
CString strLocalName;
pDlg->GetLocalHostName(strLocalName); CString strLocalIP;
pDlg->GetIpAddress(strLocalName,strLocalIP);
pDlg->AddMsgList(strLocalIP+\"->\"+strLocalName,strMsg);
int i=0;
sockClient.Close();
return 0; }
UINT _ThreadCapture(LPVOID lparam) //抓取对方屏幕线程 {
错
错
错
CMyQQDlg *pDlg=(CMyQQDlg *)lparam; if(pDlg->StopServer==true) return -1;
CSocket sockClient; sockClient.Create(); CString ip;
pDlg->m_You_IP.GetWindowText(ip);
sockClient.Connect(ip, PORT+pDlg->m_client); //首先发送标记C为抓取,2 int end=0;
end=sockClient.Send(\"C\
///////////////////////////////////////////////////////////////////发送标志是否成功 if(end==SOCKET_ERROR) { AfxMessageBox(\"_ThreadCapture Send误!\"+pDlg->GetError(GetLastError()));
return -1; }
else if(end!=2) { AfxMessageBox(\"发送头错误\"); return -1; }
return 0; }
///////////////////////////////////////////////////////////////////
UINT _SendMsgUdpThread(LPVOID lparam) //UDP发送信息 {
CMyQQDlg *pDlg=(CMyQQDlg *)lparam; if(pDlg->StopServer==true) return -1;
CSocket sockClientUdp;
pDlg->m_type=PORT+pDlg->m_client+10;
sockClientUdp.Create(pDlg->m_type,SOCK_DGRAM); CString strMsg=pDlg->m_MsgSend; int ret=0; CString ipStr;
pDlg->m_You_IP.GetWindowText(ipStr); UINT port=PORT+pDlg->m_server;
ret=sockClientUdp.SendTo(strMsg,strMsg.GetLength(),port,ipStr); if(ret==SOCKET_ERROR) {
错 DWORD error=GetLastError(); }
CString strLocalName;
pDlg->GetLocalHostName(strLocalName); CString strLocalIP;
pDlg->GetIpAddress(strLocalName,strLocalIP);
pDlg->AddMsgList(strLocalIP+\"->\"+strLocalName,strMsg); sockClientUdp.Close(); return 0; }
////////////////////////////////////客户端线程结束//////////////////////////////////////
◆◆◆ 函数 ◆◆◆
int CMyQQDlg::ReceiveFileMsg(CSocket &recSo,SOCKADDR_IN &client)//接受函数
{
// if(StopServer==true) return -1; if(m_type=='C') //抓取 { SaveYouScreen(CopyScreenToBitmap(),client);//发送地址 }
else if(m_type=='F') //文件 { SaveYouFile(recSo,client); }
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); }
recSo.Close(); return 0; }
HBITMAP CMyQQDlg::CopyScreenToBitmap() {
CRect
rect(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
HDC hScrDC,hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap;// 位图句柄 int xScrn, yScrn; // 屏幕分辨率
hScrDC = CreateDC(\"DISPLAY\//为屏幕创建设备描述表
hMemDC = CreateCompatibleDC(hScrDC);//为屏幕设备描述表创建兼容的内存设备描述表
xScrn = GetDeviceCaps(hScrDC, HORZRES);// 获得屏幕分辨率 yScrn = GetDeviceCaps(hScrDC, VERTRES); hBitmap = CreateCompatibleBitmap(hScrDC, rect.Width(), rect.Height());// 创建一个与屏幕设备描述表兼容的位图
hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap);// 把新位图选到内存设备描述表中
BitBlt(hMemDC, 0, 0, rect.Width(), rect.Height(),hScrDC,rect.left,rect.top, SRCCOPY);// 把屏幕设备描述表拷贝到内存设备描述表中
hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap);//得到屏幕位图的句柄
DeleteDC(hScrDC);//清除 DeleteDC(hMemDC);
return hBitmap;// 返回位图句柄 }
void CMyQQDlg::SaveYouScreen(HBITMAP hBitmap,SOCKADDR_IN &client)//接受屏幕
{
HDC hDC; //设备描述表
int iBits;//当前显示分辨率下每个像素所占字节数 WORD wBitCount;//位图中每个像素所占字节数 DWORD dwPaletteSize=0,//定义调色板大小 dwBmBitsSize,//位图中像素字节大小 dwDIBSize;//位图文件大小 BITMAP Bitmap;//位图属性结构
BITMAPFILEHEADER bmfHdr;//位图文件头结构 BITMAPINFOHEADER bi;//位图信息头结构
LPBITMAPINFOHEADER lpbi;//指向位图信息头结构
HANDLE hDib, hPal,hOldPal=NULL;//定义文件,分配内存句柄,调色板句柄
hDC = CreateDC(\"DISPLAY\ iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);//计算位图文件每个像素所占字节数
DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else if (iBits <= 24) wBitCount = 24; if (wBitCount <= 8) dwPaletteSize = (1< GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap); bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32)* 4 *Bitmap.bmHeight ; //为位图内容分配内存 hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi; // 处理调色板 hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC=::GetDC(NULL); hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 获取该调色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFO*) lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); } // 设置位图文件头 bmfHdr.bfType = 0x4D42; // \"BM\" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; CSocket sockClient; sockClient.Create(); sockClient.Connect(inet_ntoa(client.sin_addr), PORT+m_client); //连接到申请方 //首先发送标记F为文件,2 FILEINFO myFileInfo; myFileInfo.fileLength=sizeof(BITMAPFILEHEADER)+dwDIBSize;//得到文件大小 strcpy(myFileInfo.fileName,\"对方屏幕.bmp\");//得到文件名称 sockClient.Send(\"F\ sockClient.Send(&myFileInfo,sizeof(FILEINFO)); sockClient.Send(&bmfHdr, sizeof(BITMAPFILEHEADER)); sockClient.Send(lpbi, dwDIBSize); GlobalUnlock(hDib); GlobalFree(hDib); } int CMyQQDlg::SaveYouFile(CSocket &recSo, SOCKADDR_IN &client)//接受文件 { CString fname; CFileDialog dlg(false); //另存文件 FILEINFO myFileInfo; recSo.Receive(&myFileInfo,sizeof(FILEINFO)); int fileLength=myFileInfo.fileLength; CString strfileIp,strfileName,strfileLength; strfileIp.Format(inet_ntoa(client.sin_addr)); strfileName.Format(myFileInfo.fileName); strfileLength.Format(\"%f\ CString title=\"文件\"+strfileName+\" 大小\"+strfileLength+\"KB \"+\"来在\"+strfileIp+\" 是否接受\"; dlg.m_ofn.lpstrTitle=title;//标题条 char fileme[500]={0};//必须足够大小 strcpy(fileme,strfileIp+strfileName); dlg.m_ofn.lpstrFile=fileme; //文件名称 if(dlg.DoModal()==IDOK) { fname=dlg.GetPathName(); //得到文件名名称、路径 GetDlgItem(IDC_PROGRESS_SEND_FILE)->ShowWindow(SW_SHOW); } else { GetDlgItem(IDC_PROGRESS_SEND_FILE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(false); GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(true); GetDlgItem(IDCANCEL)->EnableWindow(true); recSo.Close(); return 0; } char buf[SIZEFILE]={0}; CFile f(fname,CFile::modeCreate|CFile::modeWrite); //存文件 m_Progress.SetRange32(0,fileLength); int n=0; //接受的字节数 0表示结束 int temp=0; GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(true); GetDlgItem(IDCANCEL)->EnableWindow(false); GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(false); for(;;) { n=recSo.Receive(buf,SIZEFILE); //接受 if(n==0) //0表示结束 break; //接受完毕 f.Write(buf,n); temp+=n; m_Progress.SetPos(temp); if(FileWork==false) FileWork=true; if(FileStop==true) { FileStop=false; FileWork=false; break ; } } f.Close(); E); m_Progress.SetPos(0); if(temp==fileLength) AddMsgList(inet_ntoa(client.sin_addr),\"文件接受成功\"); else AddMsgList(inet_ntoa(client.sin_addr),\"文件接受失败\"); FileWork=false; GetDlgItem(IDC_PROGRESS_SEND_FILE)->ShowWindow(SW_HID GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(false); GetDlgItem(IDCANCEL)->EnableWindow(true); GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(true); return 0; } CString CMyQQDlg::GetError(DWORD error) //返回错误信息 { CString strError; switch(error) { case WSANOTINITIALISED: strError=\"初始化错误\"; break; case WSAENOTCONN: strError=\"对方没有启动\"; break; case WSAEWOULDBLOCK : strError=\"对方已经关闭\"; break; case WSAECONNREFUSED: strError=\"连接的尝试被拒绝\"; break; case WSAENOTSOCK: strError=\"在一个非套接字上尝试了一个操作\"; break; case WSAEADDRINUSE: strError=\"特定的地址已在使用中\"; break; case WSAECONNRESET: strError=\"与主机的连接被关闭\"; break; default: strError=\"一般错误\"; } return strError; } int CMyQQDlg::GetLocalHostName(CString &sHostName) //获得本地计算机名称 { char szHostName[256]; int nRetCode; nRetCode=gethostname(szHostName,sizeof(szHostName)); if(nRetCode!=0) { //产生错误 sHostName=_T(\"没有取得\"); return GetLastError(); } sHostName=szHostName; return 0; } int CMyQQDlg::GetIpAddress(const CString &sHostName, &sIpAddress)//获得本地IP { struct hostent FAR * lpHostEnt=gethostbyname(sHostName); if(lpHostEnt==NULL) { //产生错误 sIpAddress=_T(\"\"); return GetLastError(); } //获取IP LPSTR lpAddr=lpHostEnt->h_addr_list[0]; if(lpAddr) { struct in_addr inAddr; memmove(&inAddr,lpAddr,4); //转换为标准格式 sIpAddress=inet_ntoa(inAddr); if(sIpAddress.IsEmpty()) sIpAddress=_T(\"没有取得\"); } return 0; } CString int CMyQQDlg::GetNamebyAddress(const CString &IpAddress,CString &sYouName)//获得对方计算机名称 { unsigned long addr; addr=inet_addr(IpAddress); struct hostent FAR * lpHostEnt=gethostbyaddr((char *)&addr,4,AF_INET); if(lpHostEnt==NULL) { //产生错误 sYouName=_T(\"\"); AfxMessageBox(\"连接不上\");//应该取得其错误 return -1; } CString name=lpHostEnt->h_name; sYouName=name; return 0; } BOOL CMyQQDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message==WM_KEYDOWN pMsg->wParam==VK_RETURN) if(GetFocus()->GetDlgCtrlID()==IDC_EDIT_SENDMSG ||GetFocus()->GetDlgCtrlID()==IDC_BUTTON_SEND_MSG) { AfxGetMainWnd()->SendMessage(WM_KSEND); return TRUE; } return CDialog::PreTranslateMessage(pMsg); } ◆ ◆◆ 控件及其功能 ◆◆◆ ◆◆◆ 开始连接 ◆◆◆ void CMyQQDlg::OnButtonConnect() //开始连接 { && // TODO: Add your control notification handler code here CString str; m_You_IP.GetWindowText(str); CString strOut,strIn; m_You_IP.GetWindowText(strIn); if(GetNamebyAddress(strIn,strOut)==-1) { GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(true);//连接不可用 return; } m_MsgSend=\"你好\"+strOut+\"!\"; UpdateData(false); if(m_nSockType==SOCK_TCP) { pThreadLisen=::AfxBeginThread(_ListenTcpThread,this); //开始TCP线程 GetDlgItem(IDC_BUTTON_SEND_MSG)->EnableWindow(true);//发送消息可用 GetDlgItem(IDC_BUTTON_SEND_FILE)->EnableWindow(true);//文件可用 GetDlgItem(IDC_BUTTON_CAPUTER)->EnableWindow(true);//抓取 } else { pThreadLisen=::AfxBeginThread(_UDPThread,this); //开始UDP线程 GetDlgItem(IDC_BUTTON_SEND_MSG)->EnableWindow(true);//发送可用 GetDlgItem(IDC_BUTTON_SEND_FILE)->EnableWindow(false);//文件不可用 } GetDlgItem(IDC_RADIO_TCP)->EnableWindow(false);//单选不可用 GetDlgItem(IDC_RADIO_UDP)->EnableWindow(false);//单选不可用 GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(true);//断开可用 GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(false);//连 接不可用 GetDlgItem(IDC_RADIO_SERVER)->EnableWindow(false); GetDlgItem(IDC_RADIO_CLIENT)->EnableWindow(false); GetDlgItem(IDC_RADIO_BOTH)->EnableWindow(false); GetDlgItem(IDC_IPADDRESS)->EnableWindow(false); } ◆◆◆ 关闭 ◆◆◆ void CMyQQDlg::OnButtonDisconnect() //关闭 { // TODO: Add your control notification handler code here GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(true); GetDlgItem(IDC_RADIO_TCP)->EnableWindow(true); ((CButton*)GetDlgItem(IDC_RADIO_UDP))->EnableWindow(true); GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(false); GetDlgItem(IDC_BUTTON_SEND_MSG)->EnableWindow(false); GetDlgItem(IDC_BUTTON_SEND_FILE)->EnableWindow(false); m_AddMsgLIst.ResetContent(); GetDlgItem(IDC_BUTTON_CLEAR)->EnableWindow(false); ((CButton*)GetDlgItem(IDC_RADIO_SERVER))->EnableWindow(true); ); ((CButton*)GetDlgItem(IDC_RADIO_BOTH))->EnableWindow(true); GetDlgItem(IDC_BUTTON_CAPUTER)->EnableWindow(false); GetDlgItem(IDC_IPADDRESS)->EnableWindow(true); m_AddMsgLIst.SendMessage(LB_SETHORIZONTALEXTENT,0,0); /////////////////////////////////////////发送结束 if(m_nSockType==SOCK_TCP) { DWORD dwStatus; if (pThreadLisen != NULL) { if(::GetExitCodeThread(pThreadLisen->m_hThread, &dwStatus)==0) { int errror=GetLastError(); ((CButton*)GetDlgItem(IDC_RADIO_CLIENT))->EnableWindow(true 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\结束 } else { delete pThreadLisen; pThreadLisen = NULL; } } } else { CSocket sockClientUdp; int succeedCreate=sockClientUdp.Create(m_type,SOCK_DGRAM); CString strMsg=\"D\"; int ret=0; CString ipStr; m_You_IP.GetWindowText(ipStr); UINT port=PORT+m_server; ret=sockClientUdp.SendTo(strMsg,1,port,ipStr); } } ◆◆◆ 发送消息 ◆◆◆ void CMyQQDlg::OnButtonSendMsg() //发送消息 { // TODO: Add your control notification handler code here UpdateData(true); if(m_MsgSend.GetLength()==0) return; if(m_nSockType==SOCK_TCP) ::AfxBeginThread(_SendMsgThread,this); else ::AfxBeginThread(_SendMsgUdpThread,this); } ◆◆◆ 显示信息 ◆◆◆ void CMyQQDlg::AddMsgList(CString IP,CString str) //添加信息于LISTBOX 控件中 { SYSTEMTIME tm; GetLocalTime(&tm); CString time; time.Format(_T(\" %d:%02.2d\"), tm.wHour, tm.wMinute); m_AddMsgLIst.AddString(IP+\"于\"+time+\"说道: \"+str); int numList=m_AddMsgLIst.GetCount()-1; GetDlgItem(IDC_BUTTON_CLEAR)->EnableWindow(true); m_AddMsgLIst.SetTopIndex(numList); m_AddMsgLIst.SetCurSel(numList); //水平滚动 int max_width=0; CSize sz; CClientDC dc(this); for(int i=0;i m_AddMsgLIst.SendMessage(LB_SETHORIZONTALEXTENT,max_width,0); } ◆◆◆ 清除聊天内容 ◆◆◆ void CMyQQDlg::OnButtonClear() //清除聊天内容 { } ◆◆◆ 发送文件 ◆◆◆ // TODO: Add your control notification handler code here m_AddMsgLIst.ResetContent(); GetDlgItem(IDC_BUTTON_CLEAR)->EnableWindow(false); m_AddMsgLIst.SendMessage(LB_SETHORIZONTALEXTENT,0,0); void CMyQQDlg::OnButtonSendFile() //发送文件 { // TODO: Add your control notification handler code here CFileDialog dlg(true); CString ip; m_You_IP.GetWindowText(ip); CString title=\"文件发往\"+ip+\"请选择\"; dlg.m_ofn.lpstrTitle=title;//标题条 if(dlg.DoModal()==IDOK) { m_fileName=dlg.GetPathName(); GetDlgItem(IDC_PROGRESS_SEND_FILE)->ShowWindow(SW_SHOW); pThreadSendFile=::AfxBeginThread(_SendFileThread,this); //开始传送文件线程 } } ◆◆◆ 停止操作 ◆◆◆ void CMyQQDlg::OnButtonStopFile() { // TODO: Add your control notification handler code here FileStop=true; FileWork=false; GetDlgItem(IDCANCEL)->EnableWindow(true); GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(true); } LRESULT CMyQQDlg::OnKSend(WPARAM wParam,LPARAM lParam) { OnButtonSendMsg(); return 0; } ◆◆◆ 抓取屏幕 ◆◆◆ void CMyQQDlg::OnButtonCaputer() //抓取屏幕 { // TODO: Add your control notification handler code here pThreadCaputre=::AfxBeginThread(_ThreadCapture,this); //开始传送文件线程 } ◆◆◆ 连接方式 ◆◆◆ void CMyQQDlg::OnRadioTcp() //选择TCP模式 { // TODO: Add your control notification handler code here m_nSockType=SOCK_TCP; CString text; if(m_WorkType==0) text=\"P2P通讯服务器\"; else if(m_WorkType==1) text=\"P2P通讯客户端\"; else text=\"P2P通讯\"; SetWindowText(text+\" TCP方式\"); } void CMyQQDlg::OnRadioUdp() //选择UPD模式 { // TODO: Add your control notification handler code here m_nSockType=SOCK_UDP; CString text; if(m_WorkType==0) text=\"P2P通讯服务器\"; else if(m_WorkType==1) text=\"P2P通讯客户端\"; else text=\"P2P通讯\"; SetWindowText(text+\" UDP方式\"); } ◆◆◆ 连接方式 ◆◆◆ void CMyQQDlg::OnRadioServer() { // TODO: Add your control notification handler code here CString text; if(m_nSockType==SOCK_TCP) text=\"TCP方式\"; else text=\"UDP方式\"; m_server=1; m_client=2; m_WorkType=0; SetWindowText(\"P2P通讯服务器 \"+text); GetDlgItem(IDC_BUTTON_CONNECT)->SetWindowText(\"启动服务\"); GetDlgItem(IDC_BUTTON_DISCONNECT)->SetWindowText(\"关闭服务\"); } void CMyQQDlg::OnRadioClient() { // TODO: Add your control notification handler code here CString text; if(m_nSockType==SOCK_TCP) text=\"TCP方式\"; else text=\"UDP方式\"; m_server=2; m_client=1; m_WorkType=1; SetWindowText(\"P2P通讯客户端 \"+text); GetDlgItem(IDC_BUTTON_CONNECT)->SetWindowText(\"连 接\"); GetDlgItem(IDC_BUTTON_DISCONNECT)->SetWindowText(\"断开连接\"); } void CMyQQDlg::OnRadioBoth() { // TODO: Add your control notification handler code here CString text; if(m_nSockType==SOCK_TCP) text=\"TCP方式\"; else text=\"UDP方式\"; m_server=m_client=0; m_WorkType=2; SetWindowText(\"P2P通讯 \"+text); GetDlgItem(IDC_BUTTON_CONNECT)->SetWindowText(\"启 动\"); GetDlgItem(IDC_BUTTON_DISCONNECT)->SetWindowText(\"关 闭\"); } ////////////////////////////////////////////////////////////// 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务