MFC_TCP_Clent

  1 // New_MFC_TCP_ClientDlg.cpp : 实现文件
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "New_MFC_TCP_Client.h"
  6 #include "New_MFC_TCP_ClientDlg.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 #ifdef AFX_DESIGN_TIME
 23     enum { IDD = IDD_ABOUTBOX };
 24 #endif
 25 
 26     protected:
 27     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
 28 
 29 // 实现
 30 protected:
 31     DECLARE_MESSAGE_MAP()
 32 };
 33 
 34 CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
 35 {
 36 }
 37 
 38 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
 39 {
 40     CDialogEx::DoDataExchange(pDX);
 41 }
 42 
 43 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
 44 END_MESSAGE_MAP()
 45 
 46 
 47 // CNew_MFC_TCP_ClientDlg 对话框
 48 
 49 
 50 
 51 CNew_MFC_TCP_ClientDlg::CNew_MFC_TCP_ClientDlg(CWnd* pParent /*=NULL*/)
 52     : CDialogEx(IDD_NEW_MFC_TCP_CLIENT_DIALOG, pParent)
 53 {
 54     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 55 }
 56 
 57 void CNew_MFC_TCP_ClientDlg::DoDataExchange(CDataExchange* pDX)
 58 {
 59     CDialogEx::DoDataExchange(pDX);
 60 }
 61 
 62 BEGIN_MESSAGE_MAP(CNew_MFC_TCP_ClientDlg, CDialogEx)
 63     ON_MESSAGE(WM_SOCKET,OnSocket)
 64     ON_WM_SYSCOMMAND()
 65     ON_WM_PAINT()
 66     ON_WM_QUERYDRAGICON()
 67     ON_BN_CLICKED(IDC_CONNECT, &CNew_MFC_TCP_ClientDlg::OnBnClickedConnect)
 68     ON_BN_CLICKED(IDC_SEND, &CNew_MFC_TCP_ClientDlg::OnBnClickedSend)
 69 END_MESSAGE_MAP()
 70 
 71 
 72 // CNew_MFC_TCP_ClientDlg 消息处理程序
 73 
 74 BOOL CNew_MFC_TCP_ClientDlg::OnInitDialog()
 75 {
 76     CDialogEx::OnInitDialog();
 77 
 78     // 将“关于...”菜单项添加到系统菜单中。
 79 
 80     // IDM_ABOUTBOX 必须在系统命令范围内。
 81     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 82     ASSERT(IDM_ABOUTBOX < 0xF000);
 83 
 84     CMenu* pSysMenu = GetSystemMenu(FALSE);
 85     if (pSysMenu != NULL)
 86     {
 87         BOOL bNameValid;
 88         CString strAboutMenu;
 89         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
 90         ASSERT(bNameValid);
 91         if (!strAboutMenu.IsEmpty())
 92         {
 93             pSysMenu->AppendMenu(MF_SEPARATOR);
 94             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
 95         }
 96     }
 97 
 98     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
 99     //  执行此操作
100     SetIcon(m_hIcon, TRUE);            // 设置大图标
101     SetIcon(m_hIcon, FALSE);        // 设置小图标
102 
103     // TODO: 在此添加额外的初始化代码
104 
105 
106     //开始时禁用部分控件
107     GetDlgItem(IDC_TEXT)->EnableWindow(false);
108     GetDlgItem(IDC_TEXT)->EnableWindow(false);
109     GetDlgItem(IDC_TEXT)->EnableWindow(false);
110 
111     s = ::socket(AF_INET, SOCK_STREAM, 0);  //创建套接字并返回句柄
112 
113     ::WSAAsyncSelect(s, this->m_hWnd, WM_SOCKET, FD_READ);
114 
115     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
116 }
117 
118 void CNew_MFC_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 CNew_MFC_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 CNew_MFC_TCP_ClientDlg::OnQueryDragIcon()
163 {
164     return static_cast<HCURSOR>(m_hIcon);
165 }
166 
167 
168 
169 void CNew_MFC_TCP_ClientDlg::OnBnClickedConnect()
170 {
171     // TODO: 在此添加控件通知处理程序代码
172 
173     //定义字符串变量
174     CString str;
175     CString str1;
176     int port;  //定义端口号
177 
178     GetDlgItem(IDC_ADDR)->GetWindowText(str);  //获取服务器地址
179     GetDlgItem(IDC_PORT)->GetWindowText(str1);  //获取端口号
180 
181 
182     if (str == "" || str1 == "")
183     {
184         MessageBox("服务器地址或端口不能为空");
185     }
186     else
187     {
188         port = atoi(str1.GetBuffer(1)); //将字符串转换为数字
189         addr.sin_family = AF_INET;
190         addr.sin_addr.S_un.S_addr = inet_addr(str.GetBuffer(1));  //转换服务器IP地址
191         
192         addr.sin_port = ntohs(port);
193         GetDlgItem(IDC_TEXT)->SetWindowText("正在连接服务器\r\n"); 
194 
195         if (::connect(s, (sockaddr*)&addr, sizeof(addr)))
196         {
197             GetDlgItem(IDC_TEXT)->GetWindowText(str);
198             str += "服务器连接成功\r\n";
199             GetDlgItem(IDC_TEXT)->SetWindowText(str);
200             GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);
201             //设置控件的状态
202             GetDlgItem(IDC_SEND)->EnableWindow(true);
203             GetDlgItem(IDC_ADDR)->EnableWindow(false);
204             GetDlgItem(IDC_PORT)->EnableWindow(false);
205         }
206         else
207         {
208             GetDlgItem(IDC_TEXT)->GetWindowText(str);
209             str += "连接服务器失败!请重试\r\n";
210             GetDlgItem(IDC_TEXT)->SetWindowText(str);
211 
212         }
213     }
214 
215 
216 
217 
218 
219 
220 
221 }
222 
223 
224 void CNew_MFC_TCP_ClientDlg::OnBnClickedSend()
225 {
226     // TODO: 在此添加控件通知处理程序代码
227     CString str;
228     CString str1;
229     GetDlgItem(IDC_SENDTEXT)->GetWindowText(str);  //获取用户发送信息的字符串
230     if (str == "")
231     {
232         GetDlgItem(IDC_TEXT)->GetWindowText(str1);
233         str1 += "\r\n";
234         str1 += "消息不能为空";
235         GetDlgItem(IDC_TEXT)->SetWindowText(str1);
236 
237     }
238     else
239     {
240         ::send(s, str.GetBuffer(1), str.GetLength(), 0);  //发送消息到指定服务器
241         GetDlgItem(IDC_TEXT)->GetWindowText(str1);
242         str1 += "\r\n";
243         str1 += str;
244         GetDlgItem(IDC_TEXT)->SetWindowText(str1);
245 
246 
247     }
248 }
249 
250 
251 LRESULT CNew_MFC_TCP_ClientDlg::OnSocket(WPARAM wParam, LPARAM lParam)
252 {
253     char cs[100] = {0};  //定义缓冲区
254 
255     if (lParam == FD_READ)  //如果是套子接读取时间
256     {
257         CString num ="";
258         recv(s, cs, 100, NULL);  //接收数据
259         GetDlgItem(IDC_TEXT)->GetWindowText(num);  
260         num += "\r\n服务器说:";
261         num += (LPTSTR)cs;
262         GetDlgItem(IDC_TEXT)->SetWindowText(num);
263     }
264     return true;
265 }
 1 // New_MFC_TCP_ClientDlg.h : 头文件
 2 //
 3 #define WM_SOCKET WM_USER + 100
 4 #pragma once
 5 
 6 
 7 // CNew_MFC_TCP_ClientDlg 对话框
 8 class CNew_MFC_TCP_ClientDlg : public CDialogEx
 9 {
10 // 构造
11 public:
12     CNew_MFC_TCP_ClientDlg(CWnd* pParent = NULL);    // 标准构造函数
13 
14     SOCKET s;  //定义套子接对象
15     sockaddr_in addr;  //定义套子接地址结构变量
16 
17     afx_msg LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
18 
19 // 对话框数据
20 #ifdef AFX_DESIGN_TIME
21     enum { IDD = IDD_NEW_MFC_TCP_CLIENT_DIALOG };
22 #endif
23 
24     protected:
25     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
26 
27 
28 // 实现
29 protected:
30     HICON m_hIcon;
31 
32     // 生成的消息映射函数
33     virtual BOOL OnInitDialog();
34     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
35     afx_msg void OnPaint();
36     afx_msg HCURSOR OnQueryDragIcon();
37     DECLARE_MESSAGE_MAP()
38 public:
39     afx_msg void OnBnClickedConnect();
40     afx_msg void OnBnClickedSend();
41 };

猜你喜欢

转载自www.cnblogs.com/zuoluokeji/p/9488851.html
MFC
tcp