FMC_TCP_Client

 1 // MFC_TCP_ClientDlg.h : 头文件
 2 //
 3 #define WM_SOCKET WM_USER + 100
 4 #pragma once
 5 
 6 
 7 // CMFC_TCP_ClientDlg 对话框
 8 class CMFC_TCP_ClientDlg : public CDialogEx
 9 {
10 // 构造
11 public:
12     CMFC_TCP_ClientDlg(CWnd* pParent = NULL);    // 标准构造函数
13 
14 
15 
16     SOCKET s;             //定义套接字对象
17     sockaddr_in addr;     //定义套接字地址结构变量
18 
19     afx_msg LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
20 
21 
22 
23 
24 // 对话框数据
25 #ifdef AFX_DESIGN_TIME
26     enum { IDD = IDD_MFC_TCP_CLIENT_DIALOG };
27 #endif
28 
29     protected:
30     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
31 
32 
33 // 实现
34 protected:
35     HICON m_hIcon;
36 
37     // 生成的消息映射函数
38     virtual BOOL OnInitDialog();
39     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
40     afx_msg void OnPaint();
41     afx_msg HCURSOR OnQueryDragIcon();
42     DECLARE_MESSAGE_MAP()
43 public:
44     afx_msg void OnBnClickedButton2();
45     afx_msg void OnBnClickedConnect();
46     afx_msg void OnBnClickedSend();
47 };
  1 // MFC_TCP_ClientDlg.cpp : 实现文件
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "MFC_TCP_Client.h"
  6 #include "MFC_TCP_ClientDlg.h"
  7 #include "afxdialogex.h"
  8 
  9 #ifdef _DEBUG
 10 #define new DEBUG_NEW
 11 #endif
 12 
 13 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
 14 
 15 class CAboutDlg : public CDialogEx
 16 {
 17 public:
 18     CAboutDlg();
 19 
 20 // 对话框数据
 21 #ifdef AFX_DESIGN_TIME
 22     enum { IDD = IDD_ABOUTBOX };
 23 #endif
 24 
 25     protected:
 26     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
 27 
 28 // 实现
 29 protected:
 30     DECLARE_MESSAGE_MAP()
 31 };
 32 
 33 CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
 34 {
 35 }
 36 
 37 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
 38 {
 39     CDialogEx::DoDataExchange(pDX);
 40 }
 41 
 42 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
 43 END_MESSAGE_MAP()
 44 
 45 
 46 // CMFC_TCP_ClientDlg 对话框
 47 
 48 
 49 
 50 CMFC_TCP_ClientDlg::CMFC_TCP_ClientDlg(CWnd* pParent /*=NULL*/)
 51     : CDialogEx(IDD_MFC_TCP_CLIENT_DIALOG, pParent)
 52 {
 53     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 54 }
 55 
 56 void CMFC_TCP_ClientDlg::DoDataExchange(CDataExchange* pDX)
 57 {
 58     CDialogEx::DoDataExchange(pDX);
 59 }
 60 
 61 BEGIN_MESSAGE_MAP(CMFC_TCP_ClientDlg, CDialogEx)
 62     ON_MESSAGE(WM_SOCKET, OnSocket)
 63     ON_WM_SYSCOMMAND()
 64     ON_WM_PAINT()
 65     ON_WM_QUERYDRAGICON()
 66     ON_BN_CLICKED(Connect, &CMFC_TCP_ClientDlg::OnBnClickedConnect)
 67     ON_BN_CLICKED(IDC_SEND, &CMFC_TCP_ClientDlg::OnBnClickedSend)
 68 END_MESSAGE_MAP()
 69 
 70 
 71 // CMFC_TCP_ClientDlg 消息处理程序
 72 
 73 BOOL CMFC_TCP_ClientDlg::OnInitDialog()
 74 {
 75     CDialogEx::OnInitDialog();
 76 
 77     // 将“关于...”菜单项添加到系统菜单中。
 78 
 79     // IDM_ABOUTBOX 必须在系统命令范围内。
 80     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 81     ASSERT(IDM_ABOUTBOX < 0xF000);
 82 
 83     CMenu* pSysMenu = GetSystemMenu(FALSE);
 84     if (pSysMenu != NULL)
 85     {
 86         BOOL bNameValid;
 87         CString strAboutMenu;
 88         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
 89         ASSERT(bNameValid);
 90         if (!strAboutMenu.IsEmpty())
 91         {
 92             pSysMenu->AppendMenu(MF_SEPARATOR);
 93             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
 94         }
 95     }
 96 
 97     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
 98     //  执行此操作
 99     SetIcon(m_hIcon, TRUE);            // 设置大图标
100     SetIcon(m_hIcon, FALSE);        // 设置小图标
101 
102     // TODO: 在此添加额外的初始化代码
103 
104     //将消息显示框,发送消息编辑框,发送按键禁用
105 
106     GetDlgItem(IDC_TEXT)->EnableWindow(FALSE);
107     GetDlgItem(IDC_SENDTEXT)->EnableWindow(FALSE);
108     GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
109 
110     //对套子接初始化
111     s = ::socket(AF_INET, SOCK_STREAM, 0);
112     ::WSAAsyncSelect(s, this->m_hWnd, WM_SOCKET, FD_READ);
113 
114 
115     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
116 }
117 
118 void CMFC_TCP_ClientDlg::OnSysCommand(UINT nID, LPARAM lParam)
119 {
120     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
121     {
122         CAboutDlg dlgAbout;
123         dlgAbout.DoModal();
124     }
125     else
126     {
127         CDialogEx::OnSysCommand(nID, lParam);
128     }
129 }
130 
131 // 如果向对话框添加最小化按钮,则需要下面的代码
132 //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
133 //  这将由框架自动完成。
134 
135 void CMFC_TCP_ClientDlg::OnPaint()
136 {
137     if (IsIconic())
138     {
139         CPaintDC dc(this); // 用于绘制的设备上下文
140 
141         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
142 
143         // 使图标在工作区矩形中居中
144         int cxIcon = GetSystemMetrics(SM_CXICON);
145         int cyIcon = GetSystemMetrics(SM_CYICON);
146         CRect rect;
147         GetClientRect(&rect);
148         int x = (rect.Width() - cxIcon + 1) / 2;
149         int y = (rect.Height() - cyIcon + 1) / 2;
150 
151         // 绘制图标
152         dc.DrawIcon(x, y, m_hIcon);
153     }
154     else
155     {
156         CDialogEx::OnPaint();
157     }
158 }
159 
160 //当用户拖动最小化窗口时系统调用此函数取得光标
161 //显示。
162 HCURSOR CMFC_TCP_ClientDlg::OnQueryDragIcon()
163 {
164     return static_cast<HCURSOR>(m_hIcon);
165 }
166 
167 
168 
169 void CMFC_TCP_ClientDlg::OnBnClickedButton2()
170 {
171     // TODO: 在此添加控件通知处理程序代码
172 }
173 
174 
175 void CMFC_TCP_ClientDlg::OnBnClickedConnect()
176 {
177     // TODO: 在此添加控件通知处理程序代码
178     CString str;
179     CString str1;
180 
181     int port;  //定义端口号
182 
183     GetDlgItem(IDC_ADDR)->GetWindowText(str);
184     GetDlgItem(IDC_PORT)->GetWindowText(str1);
185 
186     //判断服务器端口号是否为空
187     if (str == "" || str1 == "")
188     {
189         MessageBox("服务器地址或者端口号不能为空");
190 
191     }
192     else
193     {
194         port = atoi(str1.GetBuffer(1));//将端口字符串转换为数字
195         addr.sin_family = AF_INET;
196         addr.sin_addr.S_un.S_addr = inet_addr(str.GetBuffer(1));
197         addr.sin_port = ntohs(port);
198 
199         GetDlgItem(IDC_TEXT)->SetWindowText("正在连接服务器....\r\n");
200     }
201     if (::connect(s, (sockaddr*)&addr, sizeof(addr)) != SOCKET_ERROR)
202     {
203         GetDlgItem(IDC_TEXT)->SetWindowText(str);
204         str += "连接成功 \r\n";
205     
206         GetDlgItem(IDC_TEXT)->SetWindowText(str);
207 
208         GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
209 
210         GetDlgItem(IDC_SEND)->EnableWindow(true);
211 
212         GetDlgItem(IDC_ADDR)->EnableWindow(false);
213 
214         GetDlgItem(IDC_PORT)->EnableWindow(false);
215     }
216     else
217 
218     {
219 
220         GetDlgItem(IDC_TEXT)->GetWindowText(str);
221 
222         str += "连接服务器失败! 请重试\r\n";
223 
224         GetDlgItem(IDC_TEXT)->SetWindowText(str);
225 
226     }
227 }
228 
229 
230 void CMFC_TCP_ClientDlg::OnBnClickedSend()
231 {
232     // TODO: 在此添加控件通知处理程序代码
233     CString str;
234     CString str1;
235     GetDlgItem(IDC_SENDTEXT)->GetWindowText(str);
236     if (str == "")
237     {
238         GetDlgItem(IDC_TEXT)->GetWindowTextA(str1);
239         str1 += "\r\n";
240         str1 += "消息不能为空\r\n";
241         GetDlgItem(IDC_TEXT)->SetWindowText(str1);
242     }
243     else
244     {
245         ::send(s, str.GetBuffer(1), sizeof(str), 0);
246         GetDlgItem(IDC_TEXT)->GetWindowTextA(str1);
247         str1 += "\r\n";
248         str1 += str;
249         GetDlgItem(IDC_TEXT)->SetWindowText(str1);
250     }
251 }
252 
253 LRESULT CMFC_TCP_ClientDlg::OnSocket(WPARAM wParam, LPARAM lParam)
254 
255 {
256 
257     char cs[100] = { 0 };
258 
259     if (lParam == FD_READ)
260 
261     {
262 
263         CString num = "";
264         recv(s, cs, 100, NULL);
265         GetDlgItem(IDC_TEXT)->GetWindowText(num);
266         num += "\r\n服务器说: ";
267         num += (LPTSTR)cs;
268         GetDlgItem(IDC_TEXT)->SetWindowText(num);
269 
270     }
271 
272     return true;
273 
274 }
MFC_TCP_ClentDlg.cpp

猜你喜欢

转载自www.cnblogs.com/zuoluokeji/p/9470261.html
FMC