MFC Socket双向通信
记录点滴。
服务端部分程序:
1 //MySocket.h 2 3 // CMySocket 命令目标 4 5 #pragma once 6 7 #define SOCKET_EVENT WM_USER + 11 8 #define WM_MYMESSAGE WM_USER + 12 9 10 // 同意连接 发送 接收 关闭 11 enum { ACCEPT = 0, SEND = 1, RETR = 2, CLOSE = 3 }; 12 13 14 class CMySocket : public CSocket 15 { 16 public: 17 CWnd *pWnd; 18 19 CMySocket(); 20 virtual ~CMySocket(); 21 22 void AttachCWnd(CWnd *pWnd); 23 virtual void OnSend(int nErrorCode); 24 virtual void OnReceive(int nErrorCode); 25 virtual void OnClose(int nErrorCode); 26 virtual void OnAccept(int nErrorCode); //接受连接 27 28 };
1 // MySocket.cpp : 实现文件 2 // 3 4 #include "stdafx.h" 5 #include "Socket_Server_HT.h" 6 #include "MySocket.h" 7 8 9 // CMySocket 10 11 CMySocket::CMySocket() 12 { 13 pWnd = NULL; 14 15 } 16 17 CMySocket::~CMySocket() 18 { 19 } 20 21 22 // CMySocket 成员函数 23 24 void CMySocket::AttachCWnd(CWnd *pW) 25 { 26 pWnd = pW; 27 } 28 29 void CMySocket::OnSend(int nErrorCode) 30 { 31 if (pWnd) 32 pWnd->SendMessage(SOCKET_EVENT, (WPARAM)this, SEND); 33 34 CSocket::OnSend(nErrorCode); 35 } 36 37 void CMySocket::OnReceive(int nErrorCode) 38 { 39 if (pWnd) 40 pWnd->SendMessage(SOCKET_EVENT, (WPARAM)this, RETR); 41 42 // CSocket收到数据触发 OnReceive()函数 43 CSocket::OnReceive(nErrorCode); 44 } 45 46 void CMySocket::OnClose(int nErrorCode) 47 { 48 if (pWnd) 49 pWnd->SendMessage(SOCKET_EVENT, (WPARAM)this, CLOSE); 50 51 CSocket::OnClose(nErrorCode); 52 } 53 54 void CMySocket::OnAccept(int nErrorCode) 55 { 56 if (pWnd) 57 pWnd->SendMessage(SOCKET_EVENT, (WPARAM)this, ACCEPT); 58 59 CSocket::OnAccept(nErrorCode); 60 }
1 // Socket_Server_HTDlg.h : 头文件 2 // 3 4 #pragma once 5 6 #include "MySocket.h" 7 8 // CSocket_Server_HTDlg 对话框 9 class CSocket_Server_HTDlg : public CDialogEx 10 { 11 // 构造 12 public: 13 CSocket_Server_HTDlg(CWnd* pParent = NULL); // 标准构造函数 14 15 // 对话框数据 16 enum { IDD = IDD_SOCKET_SERVER_HT_DIALOG }; 17 18 protected: 19 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 20 21 // 主 Socket 22 CMySocket server_socket; 23 24 // 接收发送数据 Socket 25 CMySocket sock; 26 27 void RecvText(CMySocket &from); 28 void SendText(CMySocket &from); 29 30 // 实现 31 protected: 32 HICON m_hIcon; 33 34 // 生成的消息映射函数 35 virtual BOOL OnInitDialog(); 36 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 37 afx_msg void OnPaint(); 38 39 // 根据消息参数解析网络事件类型 40 LRESULT OnSocket(WPARAM wParam, LPARAM lParam); 41 //LRESULT OnAccept(WPARAM wParam, LPARAM lParam); 42 43 afx_msg HCURSOR OnQueryDragIcon(); 44 DECLARE_MESSAGE_MAP() 45 public: 46 CString m_ReceiveStr; 47 CString m_ReceiveStr_ID; 48 CString m_SendStr; 49 afx_msg void OnBnClickedButton1(); 50 afx_msg void OnEnChangeEdit2(); 51 52 afx_msg void OnBnClickedButton2(); 53 afx_msg void OnBnClickedButton3(); 54 };
1 // Socket_Server_HTDlg.cpp : 实现文件 2 // 3 4 #include "stdafx.h" 5 #include "Socket_Server_HT.h" 6 #include "Socket_Server_HTDlg.h" 7 #include "afxdialogex.h" 8 9 #ifdef _DEBUG 10 #define new DEBUG_NEW 11 #endif 12 13 14 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 15 16 class CAboutDlg : public CDialogEx 17 { 18 public: 19 CAboutDlg(); 20 21 // 对话框数据 22 enum { IDD = IDD_ABOUTBOX }; 23 24 protected: 25 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 26 27 // 实现 28 protected: 29 DECLARE_MESSAGE_MAP() 30 }; 31 32 CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) 33 { 34 } 35 36 void CAboutDlg::DoDataExchange(CDataExchange* pDX) 37 { 38 CDialogEx::DoDataExchange(pDX); 39 } 40 41 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) 42 END_MESSAGE_MAP() 43 44 45 // CSocket_Server_HTDlg 对话框 46 47 48 49 CSocket_Server_HTDlg::CSocket_Server_HTDlg(CWnd* pParent /*=NULL*/) 50 : CDialogEx(CSocket_Server_HTDlg::IDD, pParent) 51 , m_ReceiveStr(_T("")) 52 , m_ReceiveStr_ID(_T("")) 53 , m_SendStr(_T("")) 54 { 55 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 56 } 57 58 void CSocket_Server_HTDlg::DoDataExchange(CDataExchange* pDX) 59 { 60 CDialogEx::DoDataExchange(pDX); 61 DDX_Text(pDX, IDC_EDIT1, m_ReceiveStr); 62 DDX_Text(pDX, IDC_EDIT2, m_ReceiveStr_ID); 63 DDX_Text(pDX, IDC_EDIT3, m_SendStr); 64 } 65 66 BEGIN_MESSAGE_MAP(CSocket_Server_HTDlg, CDialogEx) 67 ON_WM_SYSCOMMAND() 68 ON_WM_PAINT() 69 ON_WM_QUERYDRAGICON() 70 ON_MESSAGE(SOCKET_EVENT, &CSocket_Server_HTDlg::OnSocket) 71 ON_BN_CLICKED(IDC_BUTTON1, &CSocket_Server_HTDlg::OnBnClickedButton1) 72 ON_EN_CHANGE(IDC_EDIT2, &CSocket_Server_HTDlg::OnEnChangeEdit2) 73 ON_BN_CLICKED(IDC_BUTTON2, &CSocket_Server_HTDlg::OnBnClickedButton2) 74 ON_BN_CLICKED(IDC_BUTTON3, &CSocket_Server_HTDlg::OnBnClickedButton3) 75 END_MESSAGE_MAP() 76 77 78 // CSocket_Server_HTDlg 消息处理程序 79 80 BOOL CSocket_Server_HTDlg::OnInitDialog() 81 { 82 CDialogEx::OnInitDialog(); 83 84 // 将“关于...”菜单项添加到系统菜单中。 85 86 // IDM_ABOUTBOX 必须在系统命令范围内。 87 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 88 ASSERT(IDM_ABOUTBOX < 0xF000); 89 90 CMenu* pSysMenu = GetSystemMenu(FALSE); 91 if (pSysMenu != NULL) 92 { 93 BOOL bNameValid; 94 CString strAboutMenu; 95 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 96 ASSERT(bNameValid); 97 if (!strAboutMenu.IsEmpty()) 98 { 99 pSysMenu->AppendMenu(MF_SEPARATOR); 100 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 101 } 102 } 103 104 // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 105 // 执行此操作 106 SetIcon(m_hIcon, TRUE); // 设置大图标 107 SetIcon(m_hIcon, FALSE); // 设置小图标 108 109 // TODO: 在此添加额外的初始化代码 110 111 server_socket.AttachCWnd(this); 112 sock.AttachCWnd(this); //将连接绑定到本窗体 113 server_socket.Create(8001, SOCK_STREAM);// SOCK_STREAM表示TCP连接 114 server_socket.Listen(); // 监听 115 116 117 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE 118 } 119 120 void CSocket_Server_HTDlg::OnSysCommand(UINT nID, LPARAM lParam) 121 { 122 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 123 { 124 CAboutDlg dlgAbout; 125 dlgAbout.DoModal(); 126 } 127 else 128 { 129 CDialogEx::OnSysCommand(nID, lParam); 130 } 131 } 132 133 // 如果向对话框添加最小化按钮,则需要下面的代码 134 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, 135 // 这将由框架自动完成。 136 137 void CSocket_Server_HTDlg::OnPaint() 138 { 139 if (IsIconic()) 140 { 141 CPaintDC dc(this); // 用于绘制的设备上下文 142 143 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 144 145 // 使图标在工作区矩形中居中 146 int cxIcon = GetSystemMetrics(SM_CXICON); 147 int cyIcon = GetSystemMetrics(SM_CYICON); 148 CRect rect; 149 GetClientRect(&rect); 150 int x = (rect.Width() - cxIcon + 1) / 2; 151 int y = (rect.Height() - cyIcon + 1) / 2; 152 153 // 绘制图标 154 dc.DrawIcon(x, y, m_hIcon); 155 } 156 else 157 { 158 CDialogEx::OnPaint(); 159 } 160 } 161 162 //当用户拖动最小化窗口时系统调用此函数取得光标 163 //显示。 164 HCURSOR CSocket_Server_HTDlg::OnQueryDragIcon() 165 { 166 return static_cast<HCURSOR>(m_hIcon); 167 } 168 169 //PMSG pMsg = AfxGetCurrentMessage(); 170 171 // wParam对应与相应客户端通信的SOCKET指针,也有可能是主SOCKET,lParam对应事件类型 172 LRESULT CSocket_Server_HTDlg::OnSocket(WPARAM wParam, LPARAM lParam) 173 { 174 SOCKADDR_IN sockAddr;//IP地址、端口号等 175 int nSize = sizeof(sockAddr); 176 BOOL res; 177 178 switch (lParam) 179 { 180 //新的连接消息 181 case ACCEPT: 182 //主SOCKET指派新创建的SOCKET与客户端通信 183 res = server_socket.Accept(sock,(SOCKADDR *)&sockAddr, &nSize); 184 if (res == FALSE) 185 MessageBox(_T("Accept Error!")); 186 break; 187 188 case SEND: //发送消息 189 SendText(sock); 190 break; 191 192 case RETR: //收到数据消息 193 RecvText(sock); //解析消息 194 break; 195 196 case CLOSE: //连接关闭消息 197 break; 198 199 } 200 return TRUE; 201 } 202 203 204 void CSocket_Server_HTDlg::RecvText(CMySocket &from) 205 { 206 TCHAR RecvBuff[256]; //缓冲 207 TCHAR RecvBuffName[256]; 208 TCHAR RecvBuffID[256]; 209 int len, i, j; //长度 210 CString temp1, temp2; 211 212 memset(RecvBuff, 0, 256); 213 memset(RecvBuffName, 0, 256); 214 memset(RecvBuffID, 0, 256); 215 216 // 读取数据 217 len = from.Receive(RecvBuff, 256); 218 219 // 测试用,可以发送 220 //from->Send(RecvBuff, 256); 221 222 if (len < 1) 223 return; 224 225 for (i = 0; i < 256; i++) 226 {// 为了使发过来的姓名和学号分开显示 227 if (RecvBuff[i] != '@') 228 { 229 RecvBuffName[i] = RecvBuff[i]; 230 } 231 else 232 { 233 break; 234 } 235 } 236 237 ++i; 238 for (j = 0; j < (256-i); j++) 239 { 240 RecvBuffID[j] = RecvBuff[i]; 241 ++i; 242 } 243 244 temp1.Format(_T("%s"), RecvBuffName); 245 m_ReceiveStr += temp1; 246 m_ReceiveStr.Append(_T("\r\n")); 247 248 temp2.Format(_T("%s"), RecvBuffID); 249 m_ReceiveStr_ID += temp2; 250 m_ReceiveStr_ID.Append(_T("\r\n")); 251 252 UpdateData(FALSE); 253 } 254 255 void CSocket_Server_HTDlg::SendText(CMySocket &from) 256 { 257 UpdateData(TRUE); 258 int len1 = m_SendStr.GetLength(); 259 char* p = (char*)m_SendStr.GetBuffer(0); 260 261 from.Send(p, len1*2); 262 263 //测试用 264 //MessageBox(_T("Send OK")); 265 } 266 267 void CSocket_Server_HTDlg::OnBnClickedButton1() 268 { 269 // TODO: 在此添加控件通知处理程序代码 270 271 m_ReceiveStr = _T(""); 272 m_ReceiveStr_ID = _T(""); 273 UpdateData(FALSE); 274 } 275 276 277 void CSocket_Server_HTDlg::OnEnChangeEdit2() 278 { 279 // TODO: 如果该控件是 RICHEDIT 控件,它将不 280 // 发送此通知,除非重写 CDialogEx::OnInitDialog() 281 // 函数并调用 CRichEditCtrl().SetEventMask(), 282 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 283 284 // TODO: 在此添加控件通知处理程序代码 285 } 286 287 288 void CSocket_Server_HTDlg::OnBnClickedButton2() 289 { 290 // TODO: 在此添加控件通知处理程序代码 291 292 // 模拟发送消息 293 server_socket.OnSend(0); 294 295 } 296 297 298 void CSocket_Server_HTDlg::OnBnClickedButton3() 299 { 300 // TODO: 在此添加控件通知处理程序代码 301 302 m_SendStr = _T(""); 303 UpdateData(FALSE); 304 }
客户端部分程序:
1 /* 2 2015.4 HT 3 将Socket封装成适合本工程的模块 4 5 MySocket.h 6 */ 7 8 #pragma once 9 10 #define SOCKET_EVENT WM_USER + 10 11 12 enum { ACCEPT = 0, SEND = 1, RETR = 2, CLOSE = 3 }; 13 14 class MySocket : public CSocket 15 { 16 public: 17 MySocket(); 18 virtual ~MySocket(); 19 20 // 绑定的窗体 21 CWnd *pWnd; 22 23 // 窗体绑定 24 void AttachCWnd(CWnd *pWnd); 25 26 virtual void OnReceive(int nErrorCode); 27 virtual void OnClose(int nErrorCode); 28 29 };
1 // MySocket.cpp : 实现文件 2 // 3 4 #include "stdafx.h" 5 #include "Socket_Client_HT.h" 6 #include "MySocket.h" 7 8 9 // MySocket 10 11 MySocket::MySocket() 12 { 13 pWnd = NULL; 14 } 15 16 MySocket::~MySocket() 17 { 18 } 19 20 21 // MySocket 成员函数 22 23 // CWnd是WINDOWS的一个基类,对话框,按钮等都是从它派生过来 24 void MySocket::AttachCWnd(CWnd *pW) 25 { 26 pWnd = pW; 27 } 28 29 void MySocket::OnReceive(int nErrorCode) 30 { 31 if (pWnd) 32 pWnd->SendMessage(SOCKET_EVENT, (long)this, RETR); 33 34 CSocket::OnReceive(nErrorCode); 35 } 36 37 void MySocket::OnClose(int nErrorCode) 38 { 39 if (pWnd) 40 pWnd->SendMessage(SOCKET_EVENT, (long)this, CLOSE); 41 42 CSocket::OnClose(nErrorCode); 43 }
1 // Socket_Client_HTDlg.h : 头文件 2 // 3 4 #pragma once 5 6 #include "MySocket.h" 7 #include "afxcmn.h" 8 9 10 // CSocket_Client_HTDlg 对话框 11 class CSocket_Client_HTDlg : public CDialogEx 12 { 13 // 构造 14 public: 15 16 17 MySocket clientSocket; // 创建自定义客户端socket 18 CString m_ipAddr; // IP 地址 19 20 CSocket_Client_HTDlg(CWnd* pParent = NULL); // 标准构造函数 21 22 // 对话框数据 23 enum { IDD = IDD_SOCKET_CLIENT_HT_DIALOG }; 24 25 protected: 26 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 27 28 29 // 实现 30 protected: 31 HICON m_hIcon; 32 33 // 生成的消息映射函数 34 virtual BOOL OnInitDialog(); 35 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 36 afx_msg void OnPaint(); 37 38 // 自定义消息接收函数 39 afx_msg LRESULT RecvText(WPARAM wParam, LPARAM lParam); 40 41 afx_msg HCURSOR OnQueryDragIcon(); 42 DECLARE_MESSAGE_MAP() 43 public: 44 CIPAddressCtrl m_IP; 45 CString m_SendStr; 46 CString m_SendStrNum; 47 CString m_ReceiveStr; 48 afx_msg void OnBnClickedButton1(); 49 afx_msg void OnBnClickedButton2(); 50 afx_msg void OnBnClickedButton3(); 51 afx_msg void OnBnClickedButton4(); 52 53 };
1 // Socket_Client_HTDlg.cpp : 实现文件 2 // 3 4 #include "stdafx.h" 5 #include "Socket_Client_HT.h" 6 #include "Socket_Client_HTDlg.h" 7 #include "afxdialogex.h" 8 9 #ifdef _DEBUG 10 #define new DEBUG_NEW 11 #endif 12 13 14 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 15 16 class CAboutDlg : public CDialogEx 17 { 18 public: 19 CAboutDlg(); 20 21 // 对话框数据 22 enum { IDD = IDD_ABOUTBOX }; 23 24 protected: 25 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 26 27 // 实现 28 protected: 29 DECLARE_MESSAGE_MAP() 30 }; 31 32 CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) 33 { 34 } 35 36 void CAboutDlg::DoDataExchange(CDataExchange* pDX) 37 { 38 CDialogEx::DoDataExchange(pDX); 39 } 40 41 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) 42 END_MESSAGE_MAP() 43 44 45 // CSocket_Client_HTDlg 对话框 46 47 48 49 CSocket_Client_HTDlg::CSocket_Client_HTDlg(CWnd* pParent /*=NULL*/) 50 : CDialogEx(CSocket_Client_HTDlg::IDD, pParent) 51 , m_SendStr(_T("")) 52 , m_ReceiveStr(_T("")) 53 , m_SendStrNum(_T("")) 54 { 55 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 56 } 57 58 void CSocket_Client_HTDlg::DoDataExchange(CDataExchange* pDX) 59 { 60 CDialogEx::DoDataExchange(pDX); 61 DDX_Control(pDX, IDC_IPADDRESS1, m_IP); 62 DDX_Text(pDX, IDC_EDIT1, m_SendStr); 63 DDX_Text(pDX, IDC_EDIT2, m_ReceiveStr); 64 DDX_Text(pDX, IDC_EDIT3, m_SendStrNum); 65 } 66 67 BEGIN_MESSAGE_MAP(CSocket_Client_HTDlg, CDialogEx) 68 ON_WM_SYSCOMMAND() 69 ON_WM_PAINT() 70 ON_WM_QUERYDRAGICON() 71 ON_MESSAGE(SOCKET_EVENT, &CSocket_Client_HTDlg::RecvText) 72 ON_BN_CLICKED(IDC_BUTTON1, &CSocket_Client_HTDlg::OnBnClickedButton1) 73 ON_BN_CLICKED(IDC_BUTTON2, &CSocket_Client_HTDlg::OnBnClickedButton2) 74 ON_BN_CLICKED(IDC_BUTTON3, &CSocket_Client_HTDlg::OnBnClickedButton3) 75 ON_BN_CLICKED(IDC_BUTTON4, &CSocket_Client_HTDlg::OnBnClickedButton4) 76 END_MESSAGE_MAP() 77 78 79 // CSocket_Client_HTDlg 消息处理程序 80 81 BOOL CSocket_Client_HTDlg::OnInitDialog() 82 { 83 CDialogEx::OnInitDialog(); 84 85 // 将“关于...”菜单项添加到系统菜单中。 86 87 // IDM_ABOUTBOX 必须在系统命令范围内。 88 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 89 ASSERT(IDM_ABOUTBOX < 0xF000); 90 91 CMenu* pSysMenu = GetSystemMenu(FALSE); 92 if (pSysMenu != NULL) 93 { 94 BOOL bNameValid; 95 CString strAboutMenu; 96 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 97 ASSERT(bNameValid); 98 if (!strAboutMenu.IsEmpty()) 99 { 100 pSysMenu->AppendMenu(MF_SEPARATOR); 101 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 102 } 103 } 104 105 // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 106 // 执行此操作 107 SetIcon(m_hIcon, TRUE); // 设置大图标 108 SetIcon(m_hIcon, FALSE); // 设置小图标 109 110 // TODO: 在此添加额外的初始化代码 111 112 113 m_IP.SetWindowText(_T("127.0.0.1")); 114 115 // 把SOCKET与对话框联系起来,SOCKET有消息就通知本对话框 116 clientSocket.AttachCWnd(this); 117 // SOCKET初始化 118 clientSocket.Create(); 119 120 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE 121 } 122 123 void CSocket_Client_HTDlg::OnSysCommand(UINT nID, LPARAM lParam) 124 { 125 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 126 { 127 CAboutDlg dlgAbout; 128 dlgAbout.DoModal(); 129 } 130 else 131 { 132 CDialogEx::OnSysCommand(nID, lParam); 133 } 134 } 135 136 // 如果向对话框添加最小化按钮,则需要下面的代码 137 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, 138 // 这将由框架自动完成。 139 140 void CSocket_Client_HTDlg::OnPaint() 141 { 142 if (IsIconic()) 143 { 144 CPaintDC dc(this); // 用于绘制的设备上下文 145 146 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 147 148 // 使图标在工作区矩形中居中 149 int cxIcon = GetSystemMetrics(SM_CXICON); 150 int cyIcon = GetSystemMetrics(SM_CYICON); 151 CRect rect; 152 GetClientRect(&rect); 153 int x = (rect.Width() - cxIcon + 1) / 2; 154 int y = (rect.Height() - cyIcon + 1) / 2; 155 156 // 绘制图标 157 dc.DrawIcon(x, y, m_hIcon); 158 } 159 else 160 { 161 CDialogEx::OnPaint(); 162 } 163 } 164 165 //当用户拖动最小化窗口时系统调用此函数取得光标 166 //显示。 167 HCURSOR CSocket_Client_HTDlg::OnQueryDragIcon() 168 { 169 return static_cast<HCURSOR>(m_hIcon); 170 } 171 172 int Alen = 0; //总长度 173 LRESULT CSocket_Client_HTDlg::RecvText(WPARAM wParam, LPARAM lParam) 174 { 175 TCHAR RecvBuff[256]; //缓冲 176 int len; //长度 177 CString temp; 178 memset(RecvBuff, 0, 256); 179 if (RETR == lParam) 180 { 181 // 读取数据 182 len = clientSocket.Receive(RecvBuff, 256); 183 Alen += len; 184 if (len < 1) 185 return TRUE; 186 temp.Format(_T("%s"), RecvBuff); 187 m_ReceiveStr += temp; 188 //m_ReceiveStr.Append(_T("\r\n")); 189 UpdateData(FALSE); 190 } 191 192 if (Alen > 56) 193 { 194 Alen = 0; 195 m_ReceiveStr.Append(_T("\r\n")); 196 UpdateData(FALSE); 197 } 198 199 //UpdateData(FALSE); 200 return TRUE; 201 } 202 203 204 205 void CSocket_Client_HTDlg::OnBnClickedButton1() 206 { 207 // TODO: 在此添加控件通知处理程序代码 208 209 // 发送框 210 UpdateData(TRUE); 211 212 int len1 = m_SendStr.GetLength(); 213 int len2 = m_SendStrNum.GetLength(); 214 char* p = (char*)m_SendStr.GetBuffer(0); 215 char* q = (char*)m_SendStrNum.GetBuffer(0); 216 217 clientSocket.Send(p, len1*2); 218 clientSocket.Send("@",2); 219 clientSocket.Send(q, len2*2); 220 221 UpdateData(FALSE); 222 } 223 224 225 void CSocket_Client_HTDlg::OnBnClickedButton2() 226 { 227 // TODO: 在此添加控件通知处理程序代码 228 229 m_SendStr = _T(""); 230 m_SendStrNum = _T(""); 231 UpdateData(FALSE); 232 } 233 234 235 void CSocket_Client_HTDlg::OnBnClickedButton3() 236 { 237 // TODO: 在此添加控件通知处理程序代码 238 239 m_ReceiveStr = _T(""); 240 UpdateData(FALSE); 241 } 242 243 244 void CSocket_Client_HTDlg::OnBnClickedButton4() 245 { 246 // TODO: 在此添加控件通知处理程序代码 247 248 UpdateData(TRUE); 249 LPTSTR lpstr = 0; 250 m_IP.GetWindowText(lpstr, 16); 251 // 获得IP地址 252 m_ipAddr = lpstr; 253 254 // Socket连接服务器 255 if (clientSocket.Connect(m_ipAddr, 8001) == FALSE) 256 { 257 MessageBox(_T("连接失败!")); 258 } 259 260 }