您好,欢迎来到星星旅游。
搜索
您的当前位置:首页P2P程序内容

P2P程序内容

来源:星星旅游
P2P通讯程序说明

◆◆◆ 作者 ◆◆◆

◆◆◆ 日期 ◆◆◆

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务