VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 245|回复: 0

VC++高级班之网络编程篇-[5]客户端连接及登陆

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-4-11 15:51:21 | 显示全部楼层 |阅读模式
①、        对话框界面的制作:
因为在之前的Vip教程中都给大家讲解过,所以这里就不做重复讲解了。
其中有登陆界面的制作、聊天对话框界面的制作。
=========================================================================
②、        登陆按钮响应函数中进行新线程的创建:
  1. CWinThread *pThread = AfxBeginThread(ConnectThreadProc, this);
复制代码

  1. UINT CLoginDlg::ConnectThreadProc(LPVOID pParam)
  2. {
  3.         CLoginDlg *pThis = (CLoginDlg *)pParam;

  4.         UINT nPort = 0;
  5.         CString strIp, strUser, strPass;
  6.         nPort = pThis->GetDlgItemInt(IDC_PORT_EDIT);
  7.         pThis->GetDlgItemText(IDC_SERVER_IPADDR, strIp);
  8.         pThis->GetDlgItemText(IDC_USER_EDIT, strUser);
  9.         pThis->GetDlgItemText(IDC_PASS_EDIT, strPass);

  10.         pThis->m_pChatRoomClient = new CClient();
  11.         pThis->m_pChatRoomClient->SetTargetCallback(pThis->GetSafeHwnd());
  12.         pThis->m_pChatRoomClient->ConnectToServer(strIp, nPort, strUser, strPass);

  13.         return TRUE;
  14. }
复制代码

=========================================================================
③、        CClient -> ConnectToServer 函数的封装:
  1. BOOL CClient::ConnectToServer(LPCTSTR lpszIpAddr, UINT nPort, LPCTSTR lpszUser, LPCTSTR lpszPass)
  2. {
  3.         if (!lpszIpAddr || nPort < 1 || nPort > 65535 || !lpszUser || !lpszPass) {
  4.                 return FALSE;
  5.         }

  6.         m_nPort = nPort;
  7.         _tcscpy_s(m_szServerIp, MAX_IP_LEN, lpszIpAddr);
  8.         _tcscpy_s(m_szUser, MAX_USER_LEN, lpszUser);
  9.         _tcscpy_s(m_szPass, MAX_PASS_LEN, lpszPass);

  10.         m_ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  11.         if (m_ConnectSocket == INVALID_SOCKET) {
  12.                 //AfxMessageBox(_T("新建Socket失败!"));
  13.                 NotifyMsg(MSG_CONNECT, (LPARAM)FALSE);
  14.                 return FALSE;
  15.         }

  16.         USES_CONVERSION;
  17.         char *pszIpAddr = T2A(m_szServerIp);

  18.         sockaddr_in server;
  19.         server.sin_family = AF_INET;
  20.         server.sin_port = htons(m_nPort);
  21.         server.sin_addr.s_addr = inet_addr(pszIpAddr);
  22.         if(connect(m_ConnectSocket, (sockaddr *)&server, sizeof(sockaddr)) == SOCKET_ERROR) {
  23.                 //AfxMessageBox(_T("连接失败,请重试!"));
  24.                 NotifyMsg(MSG_CONNECT, (LPARAM)FALSE);
  25.                 closesocket(m_ConnectSocket);
  26.                 return FALSE;
  27.         }

  28.         LoginProcess(); //作业

  29.         while(TRUE) {
  30.                 if(SOCKET_Select(m_ConnectSocket)) {
  31.                         CMsgHead msg;
  32.                         int iRet = RecvData(m_ConnectSocket, (char *)&msg, sizeof(msg));
  33.                         if(iRet <= 0) {
  34.                                 NotifyMsg(MSG_SERVER_RESET, (LPARAM)FALSE);
  35.                                 closesocket(m_ConnectSocket);
  36.                                 return FALSE;
  37.                         }

  38.                         //recv ok;
  39.                         TCHAR *pszBuf = new TCHAR[msg.m_cntLen];
  40.                         ZeroMemory(pszBuf, msg.m_cntLen);
  41.                         iRet = RecvData(m_ConnectSocket, (char *)pszBuf, msg.m_cntLen);
  42.                         if(iRet <= 0) {
  43.                                 //recv body error
  44.                                 delete [] pszBuf;
  45.                                 NotifyMsg(MSG_SERVER_RESET, (LPARAM)FALSE);
  46.                                 closesocket(m_ConnectSocket);
  47.                                 return FALSE;
  48.                         }


  49.                         ProcessMsg(msg, pszBuf);
  50.                         delete [] pszBuf;
  51.                 }
  52.         }

  53.         return TRUE;
  54. }
复制代码


=========================================================================
④、        CClient -> NotifyMsg函数的封装:
  1. LRESULT CClient::NotifyMsg(WPARAM wParam, LPARAM lParam)
  2. {
  3.         if (m_NotifyWnd) {
  4.                 return SendMessage(m_NotifyWnd, WM_NOTITY_MSG, wParam, lParam);
  5.         }

  6.         return S_FALSE;
  7. }
复制代码

========================================================================
⑤、自定义消息响应:
  1. LRESULT OnNotifyMsg(WPARAM wParam, LPARAM lParam);
  2. ON_MESSAGE(WM_NOTITY_MSG, &CLoginDlg::OnNotifyMsg)
  3. LRESULT CLoginDlg::OnNotifyMsg(WPARAM wParam, LPARAM lParam)
  4. {
  5.         UINT nMsg = wParam;
  6.         switch(nMsg)
  7.         {
  8.         case MSG_CONNECT:
  9.                 {
  10.                         BOOL bResult = (BOOL)lParam;
  11.                         if (bResult == FALSE) {
  12.                                 MessageBox(_T("连接服务器失败,请重试!"), _T("提示"), MB_OK);
  13.                                 GetDlgItem(IDC_SERVER_IPADDR)->EnableWindow(TRUE);
  14.                                 GetDlgItem(IDC_PORT_EDIT)->EnableWindow(TRUE);
  15.                                 GetDlgItem(IDC_USER_EDIT)->EnableWindow(TRUE);
  16.                                 GetDlgItem(IDC_PASS_EDIT)->EnableWindow(TRUE);
  17.                                 GetDlgItem(IDC_LOGIN_BTN)->EnableWindow(TRUE);
  18.                                 SetWindowText(_T("登陆验证"));
  19.                                 return FALSE;
  20.                         }
  21.                 }
  22.                 break;
  23.         case MSG_LOGIN:
  24.                 {
  25.                         BOOL bResult = (BOOL)lParam;
  26.                         if (bResult == FALSE) {
  27.                                 MessageBox(_T("登陆失败,请检查您的用户名和密码!"), _T("提示"), MB_OK);
  28.                                 return FALSE;
  29.                         }else{
  30.                                 EndDialog(IDOK);
  31.                         }
  32.                 }
  33.                 break;
  34.         default:break;
  35.         }

  36.         return TRUE;
  37. }
复制代码

========================================================================
⑥、CClient -> NotifyMsg函数的封装:
  1. BOOL CClient::ProcessMsg(CMsgHead &msg, TCHAR *pCnt)
  2. {
  3.         switch(msg.m_type)
  4.         {
  5.         case MSG_TYPE_LOGIN:
  6.                 {
  7.                         BOOL *pbAuthResult = (BOOL*)pCnt;
  8.                         NotifyMsg(MSG_LOGIN, (LPARAM)(*pbAuthResult));
  9.                 }
  10.                 break;
  11.         case MSG_TYPE_OTHER_CLIENT:
  12.                 {
  13.                         ClientArray clientArray;
  14.                         UINT nClientCount = msg.m_cntLen/sizeof(CClientInfo);
  15.                         for (UINT idx = 0; idx < nClientCount; ++idx) {
  16.                                 CClientInfo *pT = (CClientInfo*)pCnt;
  17.                                 pT += idx;

  18.                                 CClientInfo *pInfo = new CClientInfo(pT);
  19.                                 clientArray.Add(pInfo);
  20.                         }

  21.                         NotifyMsg(MSG_OTHER_CLIENT, (LPARAM)&clientArray);
  22.                 }
  23.                 break;

  24.         default:break;
  25.         }

  26.         return TRUE;
  27. }
复制代码

===================================================
※※※ 小作业:
①、        自己根据服务器端的交互协议,编写 LoginProcess(); 函数实现部分。
②、        预习ProcessMsg函数,理解其意思。
------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
VC驿站Vip会员售后答疑截图【持续更新】:http://www.cctry.com/thread-288054-1-1.html
教程介绍及详情请见:http://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之网络编程篇-[4]客户端队列管理及自定义协议
下一篇:VC++高级班之网络编程篇-[6]服务器端与客户端的消息处理

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-22 14:51

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表