局域网聊天
實現局域網聊天,涉及到服務器端和用戶端,使用MFC編程實現。
具體流程如下所示:
(1)創建ChatRoomSever項目,MFC->基于對話框
涉及到的控件有:Group-box,StaticText,Button,List Control。List Control添加成員變量:類型為CListCtrl,變量名為m_list。
添加兩個類:CClientSocket和CListenSocket,基類都是CSocket
(2)創建ChatRoomClient項目,MFC基于對話框,界面設計如下:
客戶端界面 // ChatRoomServer.h : PROJECT_NAME 應用程序的主頭文件 //#pragma once#ifndef __AFXWIN_H__#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #endif#include "resource.h" // 主符號// CChatRoomServerApp: // 有關此類的實現,請參閱 ChatRoomServer.cpp //class CChatRoomServerApp : public CWinApp { public:CChatRoomServerApp();// 重寫 public:virtual BOOL InitInstance();// 實現DECLARE_MESSAGE_MAP() };extern CChatRoomServerApp theApp; // ChatRoomClient.cpp : 定義應用程序的類行為。 //#include "stdafx.h" #include "ChatRoomClient.h" #include "ChatRoomClientDlg.h" #include "LoginDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif// CChatRoomClientAppBEGIN_MESSAGE_MAP(CChatRoomClientApp, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP()// CChatRoomClientApp 構造CChatRoomClientApp::CChatRoomClientApp() {// 支持重新啟動管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此處添加構造代碼,// 將所有重要的初始化放置在 InitInstance 中 }// 唯一的一個 CChatRoomClientApp 對象CChatRoomClientApp theApp;// CChatRoomClientApp 初始化BOOL CChatRoomClientApp::InitInstance() {// 如果一個運行在 Windows XP 上的應用程序清單指定要// 使用 ComCtl32.dll 版本 6 或更高版本來啟用可視化方式,//則需要 InitCommonControlsEx()。 否則,將無法創建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 將它設置為包括所有要在應用程序中使用的// 公共控件類。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer();// 創建 shell 管理器,以防對話框包含// 任何 shell 樹視圖控件或 shell 列表視圖控件。CShellManager *pShellManager = new CShellManager;// 激活“Windows Native”視覺管理器,以便在 MFC 控件中啟用主題CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));// 標準初始化// 如果未使用這些功能并希望減小// 最終可執行文件的大小,則應移除下列// 不需要的特定初始化例程// 更改用于存儲設置的注冊表項// TODO: 應適當修改該字符串,// 例如修改為公司或組織名SetRegistryKey(_T("應用程序向導生成的本地應用程序"));CLoginDlg loginDlg;if (IDCANCEL == loginDlg.DoModal()){return FALSE;}CChatRoomClientDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置處理何時用// “確定”來關閉對話框的代碼}else if (nResponse == IDCANCEL){// TODO: 在此放置處理何時用// “取消”來關閉對話框的代碼}else if (nResponse == -1){TRACE(traceAppMsg, 0, "警告: 對話框創建失敗,應用程序將意外終止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在對話框上使用 MFC 控件,則無法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}// 刪除上面創建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}// 由于對話框已關閉,所以將返回 FALSE 以便退出應用程序,// 而不是啟動應用程序的消息泵。return FALSE; } // ChatRoomServerDlg.h : 頭文件 //#pragma once #include "afxcmn.h" #include "resource.h" //#include"ListenSocket.h" class CListenSocket; // CChatRoomServerDlg 對話框 class CChatRoomServerDlg : public CDialogEx { // 構造 public:CChatRoomServerDlg(CWnd* pParent = NULL); // 標準構造函數// 對話框數據 #ifdef AFX_DESIGN_TIMEenum { IDD = IDD_CHATROOMSERVER_DIALOG }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實現 protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP() public:CListCtrl m_list;CListenSocket *m_pListenSocket;afx_msg void OnBnClickedBtnStart();afx_msg void OnBnClickedBtnClaose(); };// ChatRoomServerDlg.cpp : 實現文件 //#include "stdafx.h" #include "ChatRoomServer.h" #include "ChatRoomServerDlg.h" #include "afxdialogex.h" #include "ListenSocket.h" #ifdef _DEBUG #define new DEBUG_NEW #endif// 用于應用程序“關于”菜單項的 CAboutDlg 對話框class CAboutDlg : public CDialogEx { public:CAboutDlg();// 對話框數據 #ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實現 protected:DECLARE_MESSAGE_MAP() };CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { }void CAboutDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX); }BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP()// CChatRoomServerDlg 對話框CChatRoomServerDlg::CChatRoomServerDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_CHATROOMSERVER_DIALOG, pParent) {m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_pListenSocket = NULL; }void CChatRoomServerDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, m_list); }BEGIN_MESSAGE_MAP(CChatRoomServerDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BTN_START, &CChatRoomServerDlg::OnBnClickedBtnStart)ON_BN_CLICKED(IDC_BTN_CLAOSE, &CChatRoomServerDlg::OnBnClickedBtnClaose) END_MESSAGE_MAP()// CChatRoomServerDlg 消息處理程序BOOL CChatRoomServerDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標ShowWindow(SW_MINIMIZE);m_list.InsertColumn(0, _T("昵稱"), LVCFMT_LEFT, 200);m_list.InsertColumn(1, _T("IP地址"), LVCFMT_LEFT, 150);m_list.InsertColumn(2, _T("端口"), LVCFMT_LEFT, 100);// TODO: 在此添加額外的初始化代碼return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }void CChatRoomServerDlg::OnSysCommand(UINT nID, LPARAM lParam) {if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);} }// 如果向對話框添加最小化按鈕,則需要下面的代碼 // 來繪制該圖標。 對于使用文檔/視圖模型的 MFC 應用程序, // 這將由框架自動完成。void CChatRoomServerDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();} }//當用戶拖動最小化窗口時系統調用此函數取得光標 //顯示。 HCURSOR CChatRoomServerDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }//點擊開啟服務器 void CChatRoomServerDlg::OnBnClickedBtnStart() {m_pListenSocket = new CListenSocket(this);CString strMsg;if (!m_pListenSocket->Create(9880, SOCK_STREAM)){strMsg.Format(_T("創建套接字失敗:%d"), GetLastError());MessageBox(strMsg,_T("提示"));delete m_pListenSocket;m_pListenSocket = NULL;return;}if (!m_pListenSocket->Listen()){strMsg.Format(_T("監聽失敗:%d"), GetLastError());MessageBox(strMsg, _T("提示"));delete m_pListenSocket;m_pListenSocket = NULL;return;}GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);GetDlgItem(IDC_BTN_CLAOSE)->EnableWindow(TRUE); }void CChatRoomServerDlg::OnBnClickedBtnClaose() {if (m_pListenSocket == NULL)return;m_pListenSocket->Close();delete m_pListenSocket;m_pListenSocket = NULL;GetDlgItem(IDC_BTN_START)->EnableWindow(TRUE);GetDlgItem(IDC_BTN_CLAOSE)->EnableWindow(FALSE); } #pragma once #include "afxsock.h" class CClientSocket :public CSocket { public:CClientSocket();~CClientSocket();virtual void OnReceive(int nErrorCode); };/ #include "stdafx.h" #include "ClientSocket.h"extern list<CClientSocket*> g_ClientSocketList; CClientSocket::CClientSocket() { }CClientSocket::~CClientSocket() { }void CClientSocket::OnReceive(int nErrorCode) {// TODO: 在此添加專用代碼和/或調用基類char *pRecvBuffer = new char[1024];ZeroMemory(pRecvBuffer, 1024);Receive(pRecvBuffer, 1024);list<CClientSocket*>::iterator it;for (it = g_ClientSocketList.begin(); it != g_ClientSocketList.end(); it++){CClientSocket *pSocket = *it;pSocket->Send(pRecvBuffer, strlen(pRecvBuffer));}delete []pRecvBuffer;CSocket::OnReceive(nErrorCode); } #pragma once #include "afxsock.h" class CChatRoomServerDlg; class CClientSocket; class CListenSocket :public CSocket { public:CChatRoomServerDlg* m_pDlg;CListenSocket();CListenSocket(CChatRoomServerDlg* pDlg);~CListenSocket();virtual void OnAccept(int nErrorCode); };#include "stdafx.h" #include "ListenSocket.h" #include "ClientSocket.h" #include "ChatRoomServerDlg.h" list<CClientSocket*> g_ClientSocketList; CListenSocket::CListenSocket() {}CListenSocket::CListenSocket(CChatRoomServerDlg* pDlg) {m_pDlg = pDlg; }CListenSocket::~CListenSocket() { }void CListenSocket::OnAccept(int nErrorCode) {CClientSocket *pSocket = new CClientSocket;Accept(*pSocket);//獲取IP地址和端口號、用戶名char szUsername[25];ZeroMemory(szUsername, 25);recv(pSocket->m_hSocket, szUsername, 25, 0);CString strIPAddress;UINT nPort;CString strPort;pSocket->GetPeerName(strIPAddress,nPort);strPort.Format(_T("%d"), nPort);//將套接字保存到鏈表g_ClientSocketList.push_back(pSocket);//將這些信息顯示到界面m_pDlg->m_list.InsertItem(0, LPCTSTR(szUsername));m_pDlg->m_list.SetItemText(0, 1, LPCTSTR(strIPAddress));m_pDlg->m_list.SetItemText(0, 2, LPCTSTR(strPort));CSocket::OnAccept(nErrorCode); }(4)客戶端程序
// ChatRoomClient.h : PROJECT_NAME 應用程序的主頭文件 //#pragma once#ifndef __AFXWIN_H__#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #endif#include "resource.h" // 主符號// CChatRoomClientApp: // 有關此類的實現,請參閱 ChatRoomClient.cpp //class CChatRoomClientApp : public CWinApp { public:CChatRoomClientApp();CString m_strUsername;// 重寫 public:virtual BOOL InitInstance();// 實現DECLARE_MESSAGE_MAP() };extern CChatRoomClientApp theApp;// ChatRoomClient.cpp : 定義應用程序的類行為。 //#include "stdafx.h" #include "ChatRoomClient.h" #include "ChatRoomClientDlg.h" #include "LoginDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif// CChatRoomClientAppBEGIN_MESSAGE_MAP(CChatRoomClientApp, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP()// CChatRoomClientApp 構造CChatRoomClientApp::CChatRoomClientApp() {// 支持重新啟動管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此處添加構造代碼,// 將所有重要的初始化放置在 InitInstance 中 }// 唯一的一個 CChatRoomClientApp 對象CChatRoomClientApp theApp;// CChatRoomClientApp 初始化BOOL CChatRoomClientApp::InitInstance() {// 如果一個運行在 Windows XP 上的應用程序清單指定要// 使用 ComCtl32.dll 版本 6 或更高版本來啟用可視化方式,//則需要 InitCommonControlsEx()。 否則,將無法創建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 將它設置為包括所有要在應用程序中使用的// 公共控件類。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer();// 創建 shell 管理器,以防對話框包含// 任何 shell 樹視圖控件或 shell 列表視圖控件。CShellManager *pShellManager = new CShellManager;// 激活“Windows Native”視覺管理器,以便在 MFC 控件中啟用主題CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));// 標準初始化// 如果未使用這些功能并希望減小// 最終可執行文件的大小,則應移除下列// 不需要的特定初始化例程// 更改用于存儲設置的注冊表項// TODO: 應適當修改該字符串,// 例如修改為公司或組織名SetRegistryKey(_T("應用程序向導生成的本地應用程序"));CLoginDlg loginDlg;if (IDCANCEL == loginDlg.DoModal()){return FALSE;}CChatRoomClientDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置處理何時用// “確定”來關閉對話框的代碼}else if (nResponse == IDCANCEL){// TODO: 在此放置處理何時用// “取消”來關閉對話框的代碼}else if (nResponse == -1){TRACE(traceAppMsg, 0, "警告: 對話框創建失敗,應用程序將意外終止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在對話框上使用 MFC 控件,則無法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}// 刪除上面創建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}// 由于對話框已關閉,所以將返回 FALSE 以便退出應用程序,// 而不是啟動應用程序的消息泵。return FALSE; } // ChatRoomClientDlg.h : 頭文件 //#pragma once #include "afxwin.h"// CChatRoomClientDlg 對話框 class CChatRoomClientDlg : public CDialogEx { // 構造 public:CChatRoomClientDlg(CWnd* pParent = NULL); // 標準構造函數// 對話框數據 #ifdef AFX_DESIGN_TIMEenum { IDD = IDD_CHATROOMCLIENT_DIALOG }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 實現 protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP() public: // CEdit m_Histedit; // CEdit m_strSendMsg;afx_msg void OnBnClickedOk(); // CString m_Histedit;CString m_strSendMsg;CEdit m_HistEdit; }; //// ChatRoomClientDlg.cpp : 實現文件 //#include "stdafx.h" #include "ChatRoomClient.h" #include "ChatRoomClientDlg.h" #include "afxdialogex.h" #include "ClientSocket.h"#ifdef _DEBUG #define new DEBUG_NEW #endif// CChatRoomClientDlg 對話框extern CClientSocket *g_pClientSocket; CChatRoomClientDlg::CChatRoomClientDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_CHATROOMCLIENT_DIALOG, pParent), m_strSendMsg(_T("")) {m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }void CChatRoomClientDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);// DDX_Text(pDX, IDC_EDIT_HISTORY, m_Histedit);DDX_Text(pDX, IDC_EDIT_SEND, m_strSendMsg);DDX_Control(pDX, IDC_EDIT_HISTORY, m_HistEdit); }BEGIN_MESSAGE_MAP(CChatRoomClientDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CChatRoomClientDlg::OnBnClickedOk) END_MESSAGE_MAP()// CChatRoomClientDlg 消息處理程序BOOL CChatRoomClientDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標ShowWindow(SW_MINIMIZE);// TODO: 在此添加額外的初始化代碼return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }// 如果向對話框添加最小化按鈕,則需要下面的代碼 // 來繪制該圖標。 對于使用文檔/視圖模型的 MFC 應用程序, // 這將由框架自動完成。void CChatRoomClientDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();} }//當用戶拖動最小化窗口時系統調用此函數取得光標 //顯示。 HCURSOR CChatRoomClientDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); }void CChatRoomClientDlg::OnBnClickedOk() {UpdateData(TRUE);m_strSendMsg = m_strSendMsg.Trim();if (m_strSendMsg.IsEmpty()){MessageBox(_T("不能發送空消息"), _T("提示"));return;}if (m_strSendMsg.GetLength() > 1000){MessageBox(_T("發送消息過長"), _T("提示"));return;}CTime time = CTime::GetCurrentTime();CString strMsg;strMsg.Format(_T("%s\t%s: %s\r\n"), theApp.m_strUsername, time.Format(_T("%Y-%m-%d %H:%M:%S")), m_strSendMsg);g_pClientSocket->Send(strMsg,strMsg.GetLength()); // CDialogEx::OnOK(); } #pragma once #include "afxsock.h" class CClientSocket :public CSocket { public:CClientSocket();~CClientSocket();virtual void OnReceive(int nErrorCode); };// #include "stdafx.h" #include "ClientSocket.h" #include "ChatRoomClientDlg.h"CClientSocket::CClientSocket() { }CClientSocket::~CClientSocket() { }void CClientSocket::OnReceive(int nErrorCode) {char *pRecvBuffer = new char[1024];ZeroMemory(pRecvBuffer, 1024);Receive(pRecvBuffer, 1024);//將數據顯示到界面CChatRoomClientDlg* pDlg = (CChatRoomClientDlg*) AfxGetMainWnd();int nLength=pDlg->m_HistEdit.GetWindowTextLength();pDlg->m_HistEdit.SetSel(nLength, -1);//設置光標到最后pDlg->m_HistEdit.ReplaceSel(LPCTSTR(pRecvBuffer));//delete[]pRecvBuffer;CSocket::OnReceive(nErrorCode); } #pragma once// CLoginDlg 對話框class CLoginDlg : public CDialogEx {DECLARE_DYNAMIC(CLoginDlg)public:CLoginDlg(CWnd* pParent = NULL); // 標準構造函數virtual ~CLoginDlg();// 對話框數據 #ifdef AFX_DESIGN_TIMEenum { IDD = IDD_LOGIN_DLG }; #endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP() public:afx_msg void OnBnClickedOk();CString m_strUsername;CString m_strPassword; };// LoginDlg.cpp : 實現文件 //#include "stdafx.h" #include "ChatRoomClient.h" #include "LoginDlg.h" #include "afxdialogex.h" #include "ClientSocket.h"CClientSocket *g_pClientSocket = NULL; // CLoginDlg 對話框IMPLEMENT_DYNAMIC(CLoginDlg, CDialogEx)CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_LOGIN_DLG, pParent), m_strUsername(_T("zhangsan")), m_strPassword(_T("123456")) {}CLoginDlg::~CLoginDlg() { }void CLoginDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_USERNAME, m_strUsername);DDX_Text(pDX, IDC_PASSWORD, m_strPassword); }BEGIN_MESSAGE_MAP(CLoginDlg, CDialogEx)ON_BN_CLICKED(IDOK, &CLoginDlg::OnBnClickedOk) END_MESSAGE_MAP()// CLoginDlg 消息處理程序void CLoginDlg::OnBnClickedOk() {UpdateData(TRUE);if (m_strUsername.IsEmpty() || m_strPassword.IsEmpty()){MessageBox(_T("請輸入用戶名和密碼"), _T("提示"));return;}if (m_strUsername.GetLength() > 10){MessageBox(_T("用戶名不能超過10個字符"), _T("提示"));return;}if (m_strPassword != _T("123456")){MessageBox(_T("密碼錯誤"), _T("提示"));return;}theApp.m_strUsername = m_strUsername;//連接服務器CString strMsg;g_pClientSocket = new CClientSocket;if (!g_pClientSocket->Create()){strMsg.Format(_T("創建套接字失敗:%d"), GetLastError());MessageBox(strMsg, _T("提示"));delete g_pClientSocket;g_pClientSocket = NULL;return;}if (!g_pClientSocket->Connect(_T("XXXXX"), 9880)){strMsg.Format(_T("連接服務器失敗:%d"), GetLastError());MessageBox(strMsg, _T("提示"));delete g_pClientSocket;g_pClientSocket = NULL;return;}//發送用戶名信息g_pClientSocket->Send(m_strUsername, m_strUsername.GetLength());EndDialog(TRUE);}?
總結
- 上一篇: 如何在Python程序中运行Unix命令
- 下一篇: 65款天文摄影宇宙星空清晰效果Light