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 }

 

posted @ 2015-05-26 00:09  ht-beyond  阅读(6022)  评论(1编辑  收藏  举报