求助:使用 MFC 开发图形界面程序
1.程序为网络应用程序, VC Socket 开发;2. 采用多线程技术;
3. 体现多线程同步;
急求,忘哪位高手帮忙一下
邮箱785813002@
#include <afxwin.h> #include <afxsock.h> #include "WinSock.h" #include "stdafx.h" #include <atlimage.h> #define IDC_BUTTON1 1000 #define IDC_BUTTON2 1001 #define IDC_BUTTON3 1002 #define IDC_LISTBOX1 1003 #define IDC_LISTBOX2 1004 #define IDC_EDIT1 1005 #define IDC_EDIT2 1006 #define IDC_EDIT3 1007 #define IDC_GROUPBOX1 1008 #define IDC_GROUPBOX2 1009 CMyApp myApp; SOCKET sock,clisock,msgsock[50]; sockaddr_in serv,cli; int m_nAddlen,ee; int FontSize=80; BOOL DoFlag=FALSE; int xop,yop; CStatic label1; CEdit edit1; CEdit edit2; CListBox listbox1; CListBox listbox2; char ipaddress[35]; COLORREF color=RGB(0,0,0); CString str1; BOOL CMyApp::InitInstance() { if (!AfxSocketInit()) { return FALSE; } m_pMainWnd=new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) ON_WM_CREATE() ON_WM_CTLCOLOR() ON_WM_ERASEBKGND() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_BN_CLICKED(IDC_BUTTON1,OnButtonClicked1) ON_BN_CLICKED(IDC_BUTTON2,OnButtonClicked2) ON_BN_CLICKED(IDC_BUTTON3,OnButtonClicked3) END_MESSAGE_MAP() CMainWindow::CMainWindow() { Create(NULL,_T("WinSock局域网聊天工具"),WS_POPUP,CRect(100,100,606,560)); } int CMainWindow::OnCreate(LPCREATESTRUCT lpcs) { if (CFrameWnd::OnCreate(lpcs)==-1) return -1; font.CreatePointFont(80,"MS Sans Serif"); CRect rect; rect.SetRect(430,330,470,350); button1.Create(_T("连接"),WS_CHILD | WS_VISIBLE | SS_CENTER | BS_DEFPUSHBUTTON,rect,this,IDC_BUTTON1); button1.SetFont(&font); rect.SetRect(415,360,485,380); button2.Create(_T("断开连接"),WS_CHILD | WS_VISIBLE | SS_CENTER | BS_DEFPUSHBUTTON,rect,this,IDC_BUTTON2); button2.SetFont(&font); rect.SetRect(415,390,485,410); button3.Create(_T("发送信息"),WS_CHILD | WS_VISIBLE | SS_CENTER | BS_DEFPUSHBUTTON,rect,this,IDC_BUTTON3); button3.SetFont(&font); rect.SetRect(6,10,320,304); listbox1.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL,rect,this,IDC_LISTBOX1); listbox1.SetFont(&font); rect.SetRect(340,10,490,304); listbox2.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL,rect,this,IDC_LISTBOX2); listbox2.SetFont(&font); rect.SetRect(338,0,491,305); GroupBox1.Create(_T("客户端名称"),WS_CHILD | WS_VISIBLE | BS_GROUPBOX,rect,this,IDC_GROUPBOX1); GroupBox1.SetFont(&font); rect.SetRect(5,0,325,305); GroupBox2.Create(_T("聊天记录窗口"),WS_CHILD | WS_VISIBLE | BS_GROUPBOX,rect,this,IDC_GROUPBOX2); GroupBox2.SetFont(&font); rect.SetRect(105,340,190,360); edit1.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,rect,this,IDC_EDIT1); edit1.SetFont(&font); edit1.EnableWindow(FALSE); rect.SetRect(5,310,85,330); label2.Create("对方IP地址栏:",WS_CHILD | WS_VISIBLE | SS_CENTER,rect,this); label2.SetFont(&font); rect.SetRect(5,340,95,360); label1.Create(NULL,WS_CHILD | WS_VISIBLE | SS_CENTER,rect,this); label1.SetFont(&font); rect.SetRect(105,310,190,330); edit2.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,rect,this,IDC_EDIT2); edit2.SetFont(&font); rect.SetRect(20,370,400,450); edit3.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE,rect,this,IDC_EDIT3); edit3.SetFont(&font); WinSockStart(); } void CMainWindow::WinSockStart() { TRY{ for (int i=0;i<50;i++) msgsock[i]=NULL; serv.sin_addr.s_addr=htonl(INADDR_ANY); serv.sin_family=AF_INET; serv.sin_port=5000; m_nAddlen=sizeof(serv); sock=socket(AF_INET,SOCK_STREAM,0); if (bind(sock,(sockaddr*)&serv,m_nAddlen)){ MessageBox("绑定错误!"); }else{ label1.SetWindowText("成功启动服务器"); listen(sock,5); AfxBeginThread(thread,0); } }CATCH (CException,e){ }END_CATCH } int getcount(); UINT thread(LPVOID wParam) { label1.SetWindowText(""); char buff[100]; int s=1,msgcount,loop=1,flag=0; //CMainWindow *main=(CMainWindow* ) AfxGetApp()->GetMainWnd(); //CMainWindow *main=(CMainWindow* ) AfxGetApp()->m_pMainWnd; //CMainWindow *main=(CMainWindow*)CWnd::FromHandle((HWND) wParam); msgcount=getcount(); if (msgcount==-1) loop=0; if(loop){ s=1; msgsock[msgcount]=accept(sock,(sockaddr*)&(serv),&(m_nAddlen)); if (msgsock[msgcount]==INVALID_SOCKET){ label1.SetWindowText("Error accept"); }else{ AfxBeginThread(thread,0); while (s!=SOCKET_ERROR){ s=recv(msgsock[msgcount],buff,100,0); if (s!=SOCKET_ERROR){ listbox1.AddString(CString("连入端 ")+ipaddress+CString(" : ")+buff); } } msgsock[msgcount]=NULL; closesocket(msgsock[msgcount]); } } AfxEndThread(0); return 0; } int getcount() { for(int i=0;i<50;i++){ if (msgsock[i]==NULL) return i; } return -1; } UINT thread1(LPVOID wParam){ char buff[100]; char array[25][30]; int s=1,addcount=0; //CMainWindow *main=(CMainWindow* ) AfxGetApp()->GetMainWnd(); //CMainWindow *main=(CMainWindow*)AfxGetMainWnd(); //CMainWindow *main=(CMainWindow*)(CWnd::FromHandle((HWND) wParam)); while(connect(clisock,(sockaddr*)&cli,sizeof(cli))&&ee!=0){ label1.SetWindowText(""); label1.SetWindowText("等待中..."); label1.SetWindowText(""); for (int i=0;i<=65000;i++) for(int j=0;j<=200;j++); if (addcount==25) addcount=0; cli.sin_addr.s_addr=inet_addr(array[addcount++]); } if (ee==1){ edit1.SetWindowText("连接成功!"); } while (s!=SOCKET_ERROR && ee!=0){ s=recv(clisock,buff,100,0); if (s!=SOCKET_ERROR && ee!=0){ listbox1.AddString(buff); } } closesocket(clisock); AfxEndThread(0); return 0; } void CMainWindow::OnButtonClicked1() { edit2.GetWindowText(ipaddress,30); cli.sin_addr.s_addr=inet_addr(ipaddress); cli.sin_family=AF_INET; cli.sin_port=5000; clisock=socket(AF_INET,SOCK_STREAM,0); ee=1; edit1.SetWindowText(ipaddress); listbox2.AddString(ipaddress); button1.EnableWindow(FALSE); edit2.EnableWindow(FALSE); AfxBeginThread(thread1,0); } void CMainWindow::OnButtonClicked2() { ee=0; closesocket(clisock); edit2.EnableWindow(TRUE); button1.EnableWindow(TRUE); } void CMainWindow::OnButtonClicked3() { char buff[100]; edit3.GetWindowText(buff,99); listbox1.AddString(CString("本人端 : ")+inet_ntoa(serv.sin_addr)+CString(" : ")+buff); send(clisock,buff,100,0); } BOOL CMainWindow::PreTranslateMessage(MSG *pMsg) { label1.SetWindowText("成功启动服务器"); char buff[100]; edit3.GetWindowText(buff,99); CString str=buff; edit2.GetWindowText(ipaddress,30); str1=ipaddress; if ((pMsg->wParam==VK_RETURN) && (::GetKeyState(VK_CONTROL)<0)){ if (edit3.GetFocus()==GetDlgItem(IDC_EDIT3)){ if (str1.IsEmpty()){ MessageBox("请输入IP地址!"); edit3.SetWindowTextA(""); }else if (!str.IsEmpty()){ listbox1.AddString(CString("本人端 ")+inet_ntoa(serv.sin_addr)+CString(" : ")+buff); send(clisock,buff,100,0); edit3.SetWindowTextA(""); } } }else if((pMsg->wParam==0x46) && (::GetKeyState(VK_CONTROL)<0)){ CFontDialog dlg; if (IDOK==dlg.DoModal()){ font1.Detach(); LOGFONT temp; dlg.GetCurrentFont(&temp); font1.CreateFontIndirect(&temp); color=dlg.GetColor(); listbox1.SetFont(&font1,FALSE); Invalidate(); } }else if (pMsg->wParam==VK_ESCAPE){ DestroyWindow(); PostQuitMessage(0); }else if (pMsg->wParam==VK_RETURN){ if (edit3.GetFocus()==GetDlgItem(IDC_EDIT3)){ if (str1.IsEmpty()){ MessageBox("请输入IP地址!"); edit3.SetWindowTextA(""); }else if (!str.IsEmpty()){ listbox1.AddString(CString("本人端 ")+inet_ntoa(serv.sin_addr)+CString(" : ")+buff); send(clisock,buff,100,0); edit3.SetWindowTextA(""); } }else if (edit2.GetFocus()==GetDlgItem(IDC_EDIT2)){ if (!str1.IsEmpty()){ edit2.GetWindowText(ipaddress,30); cli.sin_addr.s_addr=inet_addr(ipaddress); cli.sin_family=AF_INET; cli.sin_port=5000; clisock=socket(AF_INET,SOCK_STREAM,0); ee=1; edit1.SetWindowText(ipaddress); listbox2.AddString(ipaddress); button1.EnableWindow(FALSE); edit2.EnableWindow(FALSE); AfxBeginThread(thread1,0); }else{ MessageBox("请输入IP地址!"); } } }else{ return CFrameWnd::PreTranslateMessage(pMsg); } } BOOL CMainWindow::OnEraseBkgnd(CDC *pDC) { CRect rect; GetClientRect(rect); DoGradientFill(pDC,&rect); return TRUE; } void CMainWindow::DoGradientFill(CDC *pDC,CRect rect) { CImage img; pDC->SetBkMode(TRANSPARENT); img.Load("21.png"); img.Draw(pDC->m_hDC,0,0); SetWindowLong(m_hWnd,GWL_EXSTYLE,WS_EX_LAYERED); SetLayeredWindowAttributes(RGB(255,255,255),0,LWA_COLORKEY); } HBRUSH CMainWindow::OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor) { CDC dc; CBitmap bitmap; bitmap.LoadBitmap("IDB_BITMAP2"); dc.CreateCompatibleDC(pDC); dc.SelectObject(&bitmap); HBRUSH hbr; //HBRUSH hbr=CFrameWnd::OnCtlColor (pDC,pWnd,nCtlColor ); if (listbox1.m_hWnd==pWnd->m_hWnd){ pDC->SetTextColor(color); pDC->SetBkMode(TRANSPARENT); hbr=::CreateSolidBrush(RGB(23,234,123)); return (HBRUSH)::GetStockObject(HOLLOW_BRUSH); }else if (listbox2.m_hWnd==pWnd->m_hWnd){ pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkMode(TRANSPARENT); hbr=::CreateSolidBrush(RGB(23,34,123)); return (HBRUSH)::GetStockObject(HOLLOW_BRUSH); }else if (edit1.m_hWnd==pWnd->m_hWnd){ hbr=::CreateSolidBrush(RGB(23,234,123)); return hbr; }else if (edit2.m_hWnd==pWnd->m_hWnd){ hbr=::CreateSolidBrush(RGB(23,234,123)); return hbr; }else if (edit3.m_hWnd==pWnd->m_hWnd){ pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkMode(TRANSPARENT); pDC->BitBlt(0,0,365,65,&dc,0,0,SRCCOPY); return (HBRUSH)::GetStockObject(HOLLOW_BRUSH); }else if (label1.m_hWnd==pWnd->m_hWnd){ pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)::GetStockObject(HOLLOW_BRUSH); }else if (label2.m_hWnd==pWnd->m_hWnd){ pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)::GetStockObject(HOLLOW_BRUSH); } return hbr; } void CMainWindow::PostNcDestroy() { delete this; } void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point) { DoFlag=TRUE; xop=point.x; yop=point.y; } void CMainWindow::OnLButtonUp(UINT nFlags, CPoint point) { DoFlag=FALSE; } void CMainWindow::OnMouseMove(UINT nFlags, CPoint point) { if (DoFlag){ CRect rect; ::GetWindowRect(m_hWnd,rect); ::SetWindowPos(m_hWnd,NULL,rect.left+point.x-xop,rect.top+point.y-yop,rect.Width(),rect.Height(),SWP_NOSIZE); } }
#include "Main.h" CMyApp myApp; /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.4.28 */ /**函数参数: 无参数 */ /**函数功能: 初始化窗体 */ /**函数返回值: 无返回值 */ /*************************************************/ BOOL CMyApp::InitInstance() { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) ON_WM_CREATE() ON_BN_CLICKED(IDC_BUTTON1,OnButtonClicked1) ON_NOTIFY(TVN_SELCHANGED, IDC_TREEVIEW, OnSelchangedTrdisktree) END_MESSAGE_MAP() /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.4.28 */ /**函数参数: 无参数 */ /**函数功能: 创建UDP连接 */ /**函数返回值: 无返回值 */ /*************************************************/ void CMainWindow::CreateUDP() { ListenSocket = INVALID_SOCKET; WORD VersionRequested = MAKEWORD(1,1); WSADATA wsaData; WSAStartup(VersionRequested, &wsaData); if (wsaData.wVersion !=VersionRequested) { TextBox2.SetWindowText("Wrong version or WinSock not loaded\n"); fflush(0); return; } ListenSocket = socket(PF_INET, SOCK_DGRAM, 0); if (ListenSocket == INVALID_SOCKET) { TextBox2.SetWindowText("Error: socket创建失败\n"); fflush(0); return; } char szHostName[128]; hostent *hostdata; gethostname(szHostName,128); hostdata = gethostbyname(szHostName); srv.sin_family = PF_INET; srv.sin_addr.s_addr = htonl(INADDR_ANY); srv.sin_port = htons(5000); ListBox1.AddString(CString("【在线】") + inet_ntoa(*(struct in_addr *)hostdata->h_addr_list[0])); if (bind(ListenSocket,(struct sockaddr *)&srv,sizeof(srv)) != 0) { TextBox2.SetWindowText("Error: 绑定失败\n"); fflush(0); closesocket(ListenSocket); return; } FileReader("IPList.tmp"); AfxBeginThread(RecvThread,inet_ntoa(*(struct in_addr *)hostdata->h_addr_list[0])); AfxBeginThread(SendMe,NULL); } /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.12 */ /**函数功能: 发送自己IP地址 */ /**函数返回值: 无返回值 */ /*************************************************/ UINT SendMe(LPVOID wParam) { CString Ipa2; CString Ipa; CString Ipa1; for (int i = 1; i<ListBox1.GetCount(); i++) { ListBox1.GetText(i,Ipa2); //Ipa1 = Ipa1 + Ipa2 + CString("\r\n"); //TextBox1.SetWindowText(Ipa1); dest.sin_family = PF_INET; dest.sin_addr.s_addr=inet_addr(Ipa2.Mid(8)); dest.sin_port = htons(5000); ListBox1.GetText(1,Ipa); Sent = sendto(ListenSocket, CString("@") + Ipa.Mid(8) , Ipa.Mid(8).GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } AfxEndThread(0); return 0; } /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.12 */ /**函数功能: 发送本人所有好友的IP地址 */ /**函数返回值: 无返回值 */ /*************************************************/ UINT SendAll(LPVOID wParam) { CString Ipa2; CString Msg; for (int i = 1; i<ListBox1.GetCount(); i++) { ListBox1.GetText(i,Ipa2); dest.sin_family = PF_INET; dest.sin_addr.s_addr=inet_addr(Ipa2.Mid(8)); dest.sin_port = htons(5000); for (int j = 1; j<ListBox1.GetCount(); j++) { ListBox1.GetText(j,Msg); Sent = sendto(ListenSocket, CString("%") + Msg.Mid(8), Msg.Mid(8).GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } } AfxEndThread(0); return 0; } /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.4.28 */ /**函数参数: 无参数 */ /**函数功能: 创建窗体 */ /**函数返回值: 无返回值 */ /*************************************************/ CMainWindow::CMainWindow() { Create(NULL,_T("UDP网络功能函数"),WS_OVERLAPPEDWINDOW,CRect(50,50,700,600)); } /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.4.28 */ /**函数参数: LPCREATESTRUCT窗体创建结构体 */ /**函数功能: 初始化窗体控件 */ /**函数返回值: 返回值为创建成功与否 */ /*************************************************/ int CMainWindow::OnCreate(LPCREATESTRUCT lpcs) { if (CFrameWnd::OnCreate(lpcs) == -1) return -1; font.CreatePointFont(100,_T("楷体_GB2312")); TextBox1.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | ES_MULTILINE,CRect(10,380,430,460),this,IDC_TEXTBOX1); TextBox1.SetFont(&font); TextBox2.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | ES_MULTILINE,CRect(10,10,210,370),this,IDC_TEXTBOX2); TextBox2.SetFont(&font); TextBox2.EnableWindow(FALSE); TextBox3.Create(WS_VISIBLE | WS_CHILD | WS_BORDER,CRect(90,470,190,490),this,IDC_TEXTBOX3); TextBox3.SetFont(&font); Button1.Create(_T("发送"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect(10,470,80,490),this,IDC_BUTTON1); Button1.SetFont(&font); ListBox1.Create(WS_VISIBLE | WS_CHILD | WS_BORDER,CRect(230,10,430,370),this,IDC_LISTBOX1); ListBox1.SetFont(&font); ListBox1.AddString("【群聊】"); TreeView.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT,CRect(450,10,630,480),this,IDC_TREEVIEW); ImageList.Create(28,28,ILC_COLOR32 | ILC_MASK,0,0); TreeView.SetImageList(&ImageList,TVSIL_NORMAL); CreateUDP(); return 0; } /***************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.1 */ /**函数功能: 获得IP地址列表 */ /**函数参数: 文件名字 */ /**函数返回值: 无返回值 */ /***************************************************/ void FileReader(CString FileName) { CString IPName; CFileFind fd; if (fd.FindFile(FileName) == TRUE) { CStdioFile file(FileName,CFile::modeRead); while (file.ReadString(IPName)) { ListBox1.AddString(CString("【离线】") + IPName); } } } /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.4.28 */ /**函数功能: 按键点击事件 */ /**函数返回值: 无返回值 */ /*************************************************/ void CMainWindow::OnButtonClicked1() { CString Ipa1; CString Msg; CString Ipa2; TextBox1.GetWindowText(Msg); //群聊跟能模块 if (ListBox1.GetCurSel() == 0) { for (int i = 1; i<ListBox1.GetCount(); i++) { int Len; ListBox1.GetText(i,Ipa2); dest.sin_family = PF_INET; //dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]); dest.sin_addr.s_addr=inet_addr(Ipa2.Mid(8)); dest.sin_port = htons(5000); //TextBox1.SetWindowText("信息已经被发送到主机 %s 端口为 %i\n",inet_ntoa(dest.sin_addr), ntohs(dest.sin_port)); Len = strlen(Msg); Sent = sendto(ListenSocket, Msg, Msg.GetLength(), 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } } //私聊功能模块 else { int Len; ListBox1.GetText(ListBox1.GetCurSel(),Ipa1); dest.sin_family = PF_INET; //dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]); dest.sin_addr.s_addr=inet_addr(Ipa1.Mid(8)); dest.sin_port = htons(5000); //TextBox1.SetWindowText("信息已经被发送到主机 %s 端口为 %i\n",inet_ntoa(dest.sin_addr), ntohs(dest.sin_port)); Len = strlen(Msg); Sent = sendto(ListenSocket, Msg, Msg.GetLength(), 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } } /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.4.28 */ /**函数功能: 接受文件线程 */ /**函数返回值: 返回线程 */ /*************************************************/ UINT RecvThread(LPVOID wParam) { char buf[4096]; int len = sizeof(client); CString buff=""; while(TRUE) { int result = recvfrom(ListenSocket, buf, sizeof(buf)-1, 0,(sockaddr*)&client, (socklen_t *)&len); for (int j = 1 ;j<ListBox1.GetCount(); j++) { if(ListBox1.FindString(j,CString("【在线】") + inet_ntoa(client.sin_addr)) == LB_ERR) { FileWriter(inet_ntoa(client.sin_addr)); ReConnect(inet_ntoa(client.sin_addr)); break; } } buf[result]=0; if (result > 0) { //获取根目录 if (buf[0] == '&') { Index1 = ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); root = TreeView.InsertItem(CString(buf).Mid(1),0,0); } //获取子目录名 else if (buf[0] == '#') { Index1 = ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); TreeView.InsertItem(CString(buf).Mid(1),Index1,Index1,root); } //获取文件名 else if (buf[0] == '$') { Index2 = ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); TreeView.InsertItem(CString(buf).Mid(1),Index2,Index2,root); } //点击事件 else if (buf[0] == '*') { strcat(buf ,"\\*.*"); AfxBeginThread(SendDir,(char *)buf + 1); } //发送自己的IP地址 else if (buf[0] == '@') { CString UserName; for (int j = 1 ;j<ListBox1.GetCount(); j++) { if(ListBox1.FindString(j,CString("【在线】") + inet_ntoa(client.sin_addr)) == LB_ERR) { ListBox1.AddString(CString("【在线】") + CString(buf).Mid(1)); Sent = sendto(ListenSocket, CString("@") + (char*)wParam, strlen((char*)wParam) + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } ListBox1.GetText(j,UserName); if (UserName.Mid(8) == CString(buf).Mid(1) && UserName.Left(8) == CString("【离线】")) { ListBox1.DeleteString(j); break; } } //Sent = sendto(ListenSocket, CString("@") + (char*)wParam, strlen((char*)wParam) + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } //接受消息 else { buff = buff + CString(buf) + "\r\n"; //TextBox2.SetWindowText(CString("Message received from host") +inet_ntoa(client.sin_addr) + CString("port") + ntohs(client.sin_port) + CString("\r\n")); TextBox2.SetWindowText(buff); } } //TreeView.Invalidate(); } AfxEndThread(0); return 0; } /***************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.1 */ /**函数功能: 记录对方IP地址 */ /**函数参数: 对方的IP */ /**函数返回值: 无返回值 */ /***************************************************/ void FileWriter(CString IPName) { CFile file; file.Open("IPList.tmp",CFile::modeCreate | CFile::modeWrite); file.Write(IPName + "\r\n",IPName.GetLength() + 2); } /***************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.1 */ /**函数功能: 发送目录列表 */ /**函数返回值: 无返回值 */ /***************************************************/ UINT SendDir(LPVOID wParam) { if ((char*)wParam ==NULL) { //遍历该系统中的所有盘符 DWORD dw=GetLogicalDrives(); DWORD mask=1; HTREEITEM root[1000]; for(int i=0;i<sizeof(DWORD)*8;i++){ if(dw&mask){ //遍历每个盘符下的文件 Sent = sendto(ListenSocket, CString("&") + CString(char('A'+i)), + CString(char('A'+i)).GetLength() + 1 , 0, (sockaddr *)&dest, sizeof(sockaddr_in)); FindDir(char('A'+i) + CString(":\\*.*")); } mask<<=1; } } else { FindDir((char*)wParam); } AfxEndThread(0); return 0; } /***************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.1 */ /**函数功能: 文件遍历函数 */ /**函数参数: 目录路径 */ /**函数返回值: 无返回值 */ /***************************************************/ void FindDir(CString Name) { CFileFind file; CFileFind files; CString str; BOOL bf1 = file.FindFile(Name); while (bf1) { bf1 = file.FindNextFile(); if (!file.IsDots() && !file.IsDirectory()) { Sent = sendto(ListenSocket, CString("$") + file.GetFilePath(), file.GetFilePath().GetLength() + 1 , 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } } BOOL bf2 = files.FindFile(Name); while (bf2) { bf2 = files.FindNextFile(); if (files.IsDirectory() && !files.IsDots()) { Sent = sendto(ListenSocket,CString("#") + files.GetFilePath(), files.GetFilePath().GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } } } /***************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.3 */ /**函数功能: 树形列表点击事件 */ /**函数参数: 目录路径 */ /**函数返回值: 无返回值 */ /***************************************************/ void CMainWindow::OnSelchangedTrdisktree(NMHDR* pNMHDR, LRESULT* pResult) { root = TreeView.GetSelectedItem(); Sent = sendto(ListenSocket,CString("*") + TreeView.GetItemText(root) , TreeView.GetItemText(root).GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in)); } BEGIN_MESSAGE_MAP(TextBox,CEdit) ON_WM_KEYDOWN() END_MESSAGE_MAP() /*************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.4.28 */ /**函数功能: 按键点击事件 */ /**函数返回值: 无返回值 */ /*************************************************/ void TextBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { CString Ipa; if (nChar == VK_RETURN) { GetWindowText(Ipa); hostent *hostdata; u_long ip = inet_addr(Ipa); hostdata = gethostbyaddr((char *)&ip, sizeof(ip),PF_INET); dest.sin_family = PF_INET; //dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]); dest.sin_addr.s_addr = inet_addr(Ipa); dest.sin_port = htons(5000); //ListBox1.AddString(Ipa); TextBox2.SetWindowText(CString("与") + Ipa + CString("连接成功") + CString("\r\n")); EnableWindow(FALSE); AfxBeginThread(SendDir,NULL); } } /***************************************************/ /**作 者: 丁 屹 */ /**日 期: 2010.5.10 */ /**函数功能: 返回连接事件 */ /**函数参数: 对方IP地址 */ /**函数返回值: 无返回值 */ /***************************************************/ void ReConnect(CString Ipa) { int i = 1; hostent *hostdata; u_long ip = inet_addr(Ipa); hostdata = gethostbyaddr((char *)&ip, sizeof(ip),PF_INET); dest.sin_family = PF_INET; //dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]); dest.sin_addr.s_addr=inet_addr(Ipa); dest.sin_port = htons(5000); i++; ListBox1.AddString(CString("【在线】") + Ipa); //ListBox1.AddString(inet_ntoa(*(struct in_addr *)hostdata->h_addr_list[0])); TextBox2.SetWindowText(CString("与") + Ipa + CString("连接成功") + CString("\r\n")); TextBox3.SetWindowText(Ipa); TextBox3.EnableWindow(FALSE); AfxBeginThread(SendDir,NULL); }
#include "Main.h" CMyApp myApp; CListBox ListBox1; CListBox ListBox2; sockaddr_in serv,cli,fserv,fcli; SOCKET sock1=NULL,sock2=NULL,msock1,msock2,sock3=NULL,sock4=NULL; CString SourceFileName; CString DestFileName; CFile sourceFile; CEdit TextBox1; CFile destFile; BYTE *buff1; BYTE *buff2; BOOL flag=FALSE; CString strIP; int count=0; int scount=0; int ConnectNum=0; CButton Button1; BOOL CMyApp::InitInstance() { m_pMainWnd=new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) ON_WM_CREATE() ON_WM_ERASEBKGND() ON_WM_CTLCOLOR() ON_WM_NCHITTEST() ON_BN_CLICKED(IDC_BUTTON1,OnButtonClicked1) ON_BN_CLICKED(IDC_BUTTON2,OnButtonClicked2) ON_BN_CLICKED(IDC_BUTTON3,OnButtonClicked3) END_MESSAGE_MAP() CMainWindow::CMainWindow() { if (!AfxSocketInit()) MessageBox("套接字初始失败"); Create(NULL,_T("超级终端"),WS_POPUPWINDOW,CRect((20*GetSystemMetrics(SM_CXSCREEN))/1280,(20*GetSystemMetrics(SM_CYSCREEN))/960,(960*GetSystemMetrics(SM_CXSCREEN))/1280,(900*GetSystemMetrics(SM_CYSCREEN))/960)); } int CMainWindow::OnCreate(LPCREATESTRUCT lpcs) { if (CFrameWnd::OnCreate(lpcs)==-1) return -1; int nFullWidth=GetSystemMetrics(SM_CXSCREEN); int nFullHeight=GetSystemMetrics(SM_CYSCREEN); HRGN hRgn=::CreateRoundRectRgn((10*nFullWidth)/1280,(10*nFullHeight)/960,(930*nFullWidth)/1280,(870*nFullHeight)/960,30,30); SetWindowRgn(hRgn,TRUE); font.CreatePointFont(100,"楷书_GB2312"); Button1.Create(_T("连接"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect((50*nFullWidth)/1280,(800*nFullHeight)/960,(100*nFullWidth)/1280,(825*nFullHeight)/960),this,IDC_BUTTON1); Button1.SetFont(&font); Button2.Create(_T("发送"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect((105*nFullWidth)/1280,(800*nFullHeight)/960,(155*nFullWidth)/1280,(825*nFullHeight)/960),this,IDC_BUTTON2); Button2.SetFont(&font); Button3.Create(_T("发送文件"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect((160*nFullWidth)/1280,(800*nFullHeight)/960,(220*nFullWidth)/1280,(825*nFullHeight)/960),this,IDC_BUTTON3); Button3.SetFont(&font); ListBox1.Create(WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER,CRect((300*nFullWidth)/1280,(30*nFullHeight)/960,(880*nFullWidth)/1280,(610*nFullHeight)/960),this,IDC_LISTBOX1); ListBox1.SetFont(&font); ListBox2.Create(WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER,CRect((50*nFullWidth)/1280,(30*nFullHeight)/960,(290*nFullWidth)/1280,(610*nFullHeight)/960),this,IDC_LISTBOX2); ListBox2.SetFont(&font); TextBox1.Create(WS_CHILD | WS_VISIBLE | WS_BORDER,CRect((150*nFullWidth)/1280,(615*nFullHeight)/960,(280*nFullWidth)/1280,(640*nFullHeight)/960),this,IDC_TEXTBOX1); TextBox1.SetFont(&font); TextBox2.Create(WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL | ES_MULTILINE | WS_BORDER,CRect((50*nFullWidth)/1280,(650*nFullHeight)/960,(880*nFullWidth)/1280,(790*nFullHeight)/960),this,IDC_TEXTBOX2); TextBox2.SetFont(&font); Label1.Create(_T("IP地址输入框:"),WS_VISIBLE | WS_CHILD,CRect((50*nFullWidth)/1280,(620*nFullHeight)/960,(145*nFullWidth)/1280,(645*nFullHeight)/960),this,IDC_LABEL1); Label1.SetFont(&font); CreateFileSocket(); CreateSocket(); GetHostIP(); //FindFile(); return 0; } void CMainWindow::GetHostIP() { char szHostName[128]; if (gethostname(szHostName,128)==0) { hostent *pHost; pHost=gethostbyname(szHostName); strIP=inet_ntoa(*(in_addr*)pHost->h_addr_list[0]); ListBox2.AddString(CString("本机IP:")+strIP); } } void CMainWindow::FindFile() { CFileFind file; BOOL bf=file.FindFile("C:\\record.log"); if (bf) { char buff[4096]=""; CFile file1; file1.Open("C:\\record.log",CFile::modeRead); file1.Read(buff,4096); CString buffsize1=CString(buff).Left(CString(buff).Find('#')); SourceFileName=buffsize1; CString buffsize2=CString(buff).Right(CString(buff).GetLength()-CString(buff).ReverseFind('#')-1); CString buffsize3=CString(buff).Mid(CString(buff).Find('#')+1); buffsize3=buffsize3.Left(buffsize3.Find('#')); scount=atoi(buffsize3); count=atoi(buffsize2); AutoConnect1(); AutoConnect2(); } else { MessageBox("没有文件"); } } void CMainWindow::AutoConnect1() { sock2=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); cli.sin_addr.s_addr=inet_addr("192.168.1.101"); cli.sin_family=AF_INET; cli.sin_port=5000; AfxBeginThread(&Thread2,0); } void CMainWindow::AutoConnect2() { sock3=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); fcli.sin_addr.s_addr=inet_addr("192.168.1.101"); fcli.sin_family=AF_INET; fcli.sin_port=8005; AfxBeginThread(&Thread3,0); } void AutoConnect(CString ip) { sock3=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); fcli.sin_addr.s_addr=inet_addr(ip); fcli.sin_family=AF_INET; fcli.sin_port=8005; AfxBeginThread(&Thread2,0); } BOOL CMainWindow::OnEraseBkgnd(CDC *pDC) { CRect rect; GetClientRect(rect); FillWindow(pDC,rect); return TRUE; } void CMainWindow::FillWindow(CDC *pDC,CRect rect) { CBrush *pBrush[255]; for (int i=0;i<255;i++) pBrush[i]=new CBrush(PALETTERGB(0,0,255-i)); CRect pRect; int nWidth=rect.right-rect.left; int nHeight=rect.bottom-rect.top; for (int i=0;i<nHeight;i++) { pRect.SetRect(0,i,nWidth,i+1); pDC->FillRect(&pRect,pBrush[(i*254)/nHeight]); } for (int i=0;i<255;i++) delete pBrush[i]; } void CMainWindow::OnButtonClicked1() { flag=TRUE; TextBox1.GetWindowText(ipaddress); TextBox1.EnableWindow(FALSE); sock2=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); cli.sin_addr.s_addr=inet_addr(ipaddress); cli.sin_family=AF_INET; cli.sin_port=5000; ListBox2.AddString(CString("对方IP:")+ipaddress); AfxBeginThread(&Thread2,0); } void CMainWindow::OnButtonClicked2() { CString buff; TextBox2.GetWindowText(buff); send(sock2,strIP+CString(":")+buff,strIP.GetLength()+buff.GetLength()+1,0); TextBox2.SetWindowText(""); } void CMainWindow::OnButtonClicked3() { CFileDialog dialog(true,"*.*"); if (dialog.DoModal()==IDOK) { scount=0; count=1; SourceFileName=dialog.GetPathName(); sock3=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); fcli.sin_addr.s_addr=inet_addr(ipaddress); fcli.sin_family=AF_INET; fcli.sin_port=8005; AfxBeginThread(&Thread3,0); } } UINT Thread4(LPVOID wParam) { CFileException ex; CString FileSize; while(TRUE) { int m_Addlem; m_Addlem=sizeof(fserv); msock2=accept(sock4,(sockaddr*)&fserv,&m_Addlem); char buff[1024]=""; if (msock2!=INVALID_SOCKET) { ListBox1.AddString("接受成功"); recv(msock2,buff,sizeof(buff),0); ListBox1.AddString(buff); } DestFileName="C:\\template.tmp"; destFile.Open((LPCTSTR)DestFileName, CFile::modeWrite | CFile::modeCreate, &ex); buff1=new BYTE[4096]; DWORD dwRead=0; //destFile.Seek(count,CFile::begin); count=0; do{ dwRead=recv(msock2,(char *)buff1,4096,0); count+=4096; destFile.Write(buff1,dwRead); }while (dwRead>0); destFile.Close(); FileSize.Format("%d",count); ListBox1.AddString(CString("文件大小:")+CString(buff).Right(CString(buff).GetLength()-CString(buff).ReverseFind(':')-1)+CString(" 完成传输:")+FileSize); CFileDialog dialog(true,"*.*"); if (dialog.DoModal()==IDOK) { CString NewDestFileName=dialog.GetPathName(); destFile.Rename(DestFileName,NewDestFileName); } } closesocket(sock4); closesocket(msock2); AfxEndThread(0); return 0; } UINT Thread3(LPVOID wParam) { CString FileSize; CFileException ex; sourceFile.Open(SourceFileName,CFile::modeRead, &ex); FileSize.Format("%d",sourceFile.GetLength()); if (connect(sock3,(sockaddr*)&fcli,sizeof(fcli))!=INVALID_SOCKET) { ListBox1.AddString("连接成功"); send(sock3,SourceFileName+CString(" :")+FileSize,SourceFileName.GetLength()+FileSize.GetLength()+2,0); } buff2=new BYTE[4096]; DWORD dwRead=0; scount=0; //sourceFile.Seek(scount,CFile::begin); do{ dwRead = sourceFile.Read(buff2,4096); scount+=4096; send(sock3,(char*)buff2,dwRead,0); }while (dwRead > 0); sourceFile.Close(); closesocket(sock3); AfxEndThread(0); return 0; } UINT Thread2(LPVOID wParam) { if (connect(sock2,(sockaddr*)&cli,sizeof(cli))!=INVALID_SOCKET) { ConnectNum++; if (ConnectNum<2) { ListBox1.AddString("连接成功"); send(sock2,CString("#")+strIP,strIP.GetLength()+1,0); } } while(TRUE) { char buff[1024]=""; //recv(sock2,buff,1024,0); //ListBox1.AddString(buff); } closesocket(sock2); AfxBeginThread(0); return 0; } UINT Thread1(LPVOID wParam) { int i=0; while(TRUE) { int m_Addlem; m_Addlem=sizeof(serv); msock1=accept(sock1,(sockaddr*)&serv,&m_Addlem); if (msock1!=INVALID_SOCKET) { ListBox1.AddString("接受成功"); } while (TRUE) { char buff[1024]=""; recv(msock1,buff,1024,0); if (CString(buff).Left(1)=='#' && strlen(buff)>0) { i++; if (i<2 && !flag) { TextBox1.SetWindowText(CString(buff).Right(CString(buff).GetLength()-CString(buff).Find('#')-1)); ::SendMessage(Button1.m_hWnd,BM_CLICK, NULL, NULL); } } else if (strlen(buff)>0) { ListBox1.AddString(buff); } } } closesocket(sock1); closesocket(msock1); AfxEndThread(0); return 0; } void CMainWindow::CreateSocket() { sock1=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //广播地址 //serv.sin_addr.s_addr=htonl(INADDR_BROADCAST); serv.sin_addr.s_addr=htonl(INADDR_ANY); serv.sin_family=AF_INET; serv.sin_port=5000; if (bind(sock1,(sockaddr*)&serv,sizeof(serv))) { ListBox1.AddString("----文本服务器创建失败----"); return; } else { ListBox1.AddString("----文本服务器创建成功----"); listen(sock1,5); AfxBeginThread(&Thread1,0); } } void CMainWindow::CreateFileSocket() { sock4=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); fserv.sin_addr.s_addr=htonl(INADDR_ANY); fserv.sin_family=AF_INET; fserv.sin_port=8005; if (bind(sock4,(sockaddr*)&fserv,sizeof(fserv))) { ListBox1.AddString("----文件服务器创建失败----"); return; } else { ListBox1.AddString("----文件服务器创建成功----"); listen(sock4,5); AfxBeginThread(&Thread4,0); } } HBRUSH CMainWindow::OnCtlColor(CDC *pDC, CWnd *pWnd,UINT nCtlColor) { HBRUSH br=CFrameWnd::OnCtlColor(pDC,pWnd,nCtlColor); if (pWnd->m_hWnd==Label1.m_hWnd) { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,255,0)); return (HBRUSH)::GetStockObject(NULL_BRUSH); } return br; } LRESULT CMainWindow::OnNcHitTest(CPoint point) { LRESULT nHitTest=CFrameWnd::OnNcHitTest(point); if (nHitTest==HTCLIENT) { nHitTest=HTCAPTION; } return nHitTest; } BOOL CMainWindow::DestroyWindow() { /*flag=TRUE; sourceFile.Close(); destFile.Close(); closesocket(sock3); closesocket(sock4); closesocket(msock2); CFile file; CString sizename1; CString sizename2; file.Open("c:\\record.log",CFile::modeCreate | CFile::modeWrite); sizename1.Format("%d",scount); sizename2.Format("%d",count); file.Write(SourceFileName+CString("#")+sizename1+CString("#")+sizename2,SourceFileName.GetLength()+sizename1.GetLength()+sizename2.GetLength()+2); file.Close();*/ CFrameWnd::DestroyWindow(); return TRUE; }