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 }
时间: 2024-10-12 17:19:37

MFC Socket双向通信的相关文章

MFC Socket

目 录 第1章 同步TCP通讯    1 1.1 同步通讯与异步通讯    1 1.2 同步通讯类    1 1.3 同步TCP通讯客户端    4 1.3.1 界面    4 1.3.2 界面类声明    4 1.3.3 界面类构造函数    5 1.3.4 连接服务器    5 1.3.5 写数据    6 1.3.6 读数据    6 1.3.7 断开连接    7 1.4 同步TCP通讯服务端    7 1.4.1 界面    7 1.4.2 界面类声明    8 1.4.3 CSock

Java --socket双向通信

如下例子实现了利用socket简易双向通信的例子 1.建立两个java project,目录如下 2.客户端代码 package client; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Outp

mfc socket编程

socket编程用法---- 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要.由于C++语言对底层操作的优越性,许多文章都曾经介绍过用VC++进行Socket编程的方法.但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐.其实,VC++的MFC类库中提供了CAsyncSocket这样一个套接字类,用他来实现Socket编程,是非常方便的. ---- 本文将用一个Echo例程来介绍CAsyncSocket类的用法. ---- 一. 客户端 ---- 1.

MFC socket编程(浅出+深度:服务端和客户端端口问题)

要写网络程序就必须用Socket,这是程序员都知道的.而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作.是的,就跟常见的文件操作一样,只要写过就一定知道. 对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了.对于TCP/IP,我们还知道TCP和UDP,前者可以保证数据的正确和可靠性,后者则允许数据丢失.最后,我们还知道,在建立连接前,必须知道对方的IP地址和

MFC socket编程(一)

一.基本概念 a) 同步:指发送方发出数据后,等收到接收方发回的响应,才发下一个数据包的通信方式. nb)异步:指的是发送方不等接收方响应,便接着发下个数据包的通信方式. c) 阻塞:指调用某函数时,直到该函数完成操作,才返回:否则一直阻塞在该调用上. d) 非阻塞:指调用某操作时,不管操作是否成功都立即返回,而不会挂在该操作上. 二.soeket简介 Client/Server (客户机/服务器)模型为最常用的模型.在这种方案中客户应用程序向服务器程序请求服务,一个服务器程序通常用一个众所周知

MFC socket编程(二)

一.大端.小端法定义 1.1小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. (主机字节顺序) 1.2 大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端.(网络字节顺序) 举个简单的例子,对于整形0x12345678.它在大端法和小端法的系统内中,分别如图所示的方式存放. 二.字节顺序转换 Windows Sockets 的htons函数将把一个u_short类型的值从

CSocket必须使用stream socket不能够使用数据报 socket

如果使用MFC socket类CSoket通讯,必须使用stream socket,不能够使用 SOCK_DGRAM 类型socket.原因如下: 1 stream socket和数据报socket的区别就是, 前者是可靠传输,数据会被拆成多个数据包发送: (1) 收发两端的发送的数据包顺序要一样. (2)数据包还不能重复. (3)每个数据包没有界限. 后者恰好相反. 2 CSocket通过CArchive来从socket中读写数据.主要原理是,创建一个和CSocket关联的CSocketFil

MFC_网络编程socket套接字

MFC socket编程 MFC socket编程 ---- 一. 客户端 ---- 1. 创建一个Dialog Based项目:CSockClient. ---- 2. 设计对话框 ---- 去掉Ok和Cancle两个按钮,增加ID_Connect(连接).ID_Send(发送).ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量. Control ID Ty

在自己的电脑上搭建环境

http://wenku.baidu.com/link?url=dPkWm8Zal1Nce9wiq89xD4nGghAaH4vvdZUpdjF7AnxXl1Xr6siH-peuzsYm0OSSA5Cxp1_CaB4wxBiCCVopx2v7wIjo12b1XCdeKu83ht3 测试环境搭建及举例 http://jingyan.baidu.com/article/676629974557c254d51b84da.html MFC/Socket网络编程:[1]服务器