
1 1 // New_MFC_TCP_SreverDlg.h : 头文件 2 2 // 3 3 #define WM_SOCKET WM_USER+100 4 4 #pragma once 5 5 6 6 7 7 // CNew_MFC_TCP_SreverDlg 对话框 8 8 class CNew_MFC_TCP_SreverDlg : public CDialogEx 9 9 { 1010 // 构造 1111 public: 1212 CNew_MFC_TCP_SreverDlg(CWnd* pParent = NULL); // 标准构造函数 1313 1414 //定义套子接句柄 1515 SOCKET s; 1616 SOCKET s1; 1717 1818 //定义套子接地址结构变量 1919 sockaddr_in addr; 2020 sockaddr_in addr1; 2121 2222 int n; //记录连接数 2323 2424 2525 // 对话框数据 2626 #ifdef AFX_DESIGN_TIME 2727 enum { IDD = IDD_NEW_MFC_TCP_SREVER_DIALOG }; 2828 #endif 2929 3030 protected: 3131 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 3232 3333 3434 // 实现 3535 protected: 3636 HICON m_hIcon; 3737 3838 // 生成的消息映射函数 3939 virtual BOOL OnInitDialog(); 4040 afx_msg void OnSysCommand(UINT nID, LPARAM lParam); 4141 afx_msg void OnPaint(); 4242 afx_msg HCURSOR OnQueryDragIcon(); 4343 DECLARE_MESSAGE_MAP() 4444 afx_msg LRESULT OnSocket(WPARAM wParam, LPARAM lParam); //自定义消息函数 4545 public: 4646 afx_msg void OnEnChangeText(); 4747 }; 48 49 1 // New_MFC_TCP_SreverDlg.cpp : 实现文件 50 2 // 51 3 52 4 #include "stdafx.h" 53 5 #include "New_MFC_TCP_Srever.h" 54 6 #include "New_MFC_TCP_SreverDlg.h" 55 7 #include "afxdialogex.h" 56 8 57 9 #ifdef _DEBUG 58 10 #define new DEBUG_NEW 59 11 #endif 60 12 61 13 62 14 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 63 15 64 16 class CAboutDlg : public CDialogEx 65 17 { 66 18 public: 67 19 CAboutDlg(); 68 20 69 21 // 对话框数据 70 22 #ifdef AFX_DESIGN_TIME 71 23 enum { IDD = IDD_ABOUTBOX }; 72 24 #endif 73 25 74 26 protected: 75 27 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 76 28 77 29 // 实现 78 30 protected: 79 31 DECLARE_MESSAGE_MAP() 80 32 }; 81 33 82 34 CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) 83 35 { 84 36 } 85 37 86 38 void CAboutDlg::DoDataExchange(CDataExchange* pDX) 87 39 { 88 40 CDialogEx::DoDataExchange(pDX); 89 41 } 90 42 91 43 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) 92 44 END_MESSAGE_MAP() 93 45 94 46 95 47 // CNew_MFC_TCP_SreverDlg 对话框 96 48 97 49 98 50 99 51 CNew_MFC_TCP_SreverDlg::CNew_MFC_TCP_SreverDlg(CWnd* pParent /*=NULL*/) 100 52 : CDialogEx(IDD_NEW_MFC_TCP_SREVER_DIALOG, pParent) 101 53 { 102 54 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 103 55 } 104 56 105 57 void CNew_MFC_TCP_SreverDlg::DoDataExchange(CDataExchange* pDX) 106 58 { 107 59 CDialogEx::DoDataExchange(pDX); 108 60 } 109 61 110 62 BEGIN_MESSAGE_MAP(CNew_MFC_TCP_SreverDlg, CDialogEx) 111 63 ON_MESSAGE(WM_SOCKET,OnSocket) 112 64 ON_WM_SYSCOMMAND() 113 65 ON_WM_PAINT() 114 66 ON_WM_QUERYDRAGICON() 115 67 ON_EN_CHANGE(IDC_TEXT, &CNew_MFC_TCP_SreverDlg::OnEnChangeText) 116 68 END_MESSAGE_MAP() 117 69 118 70 119 71 // CNew_MFC_TCP_SreverDlg 消息处理程序 120 72 121 73 BOOL CNew_MFC_TCP_SreverDlg::OnInitDialog() 122 74 { 123 75 CDialogEx::OnInitDialog(); 124 76 125 77 // 将“关于...”菜单项添加到系统菜单中。 126 78 127 79 // IDM_ABOUTBOX 必须在系统命令范围内。 128 80 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 129 81 ASSERT(IDM_ABOUTBOX < 0xF000); 130 82 131 83 CMenu* pSysMenu = GetSystemMenu(FALSE); 132 84 if (pSysMenu != NULL) 133 85 { 134 86 BOOL bNameValid; 135 87 CString strAboutMenu; 136 88 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 137 89 ASSERT(bNameValid); 138 90 if (!strAboutMenu.IsEmpty()) 139 91 { 140 92 pSysMenu->AppendMenu(MF_SEPARATOR); 141 93 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 142 94 } 143 95 } 144 96 145 97 // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 146 98 // 执行此操作 147 99 SetIcon(m_hIcon, TRUE); // 设置大图标 148100 SetIcon(m_hIcon, FALSE); // 设置小图标 149101 150102 // TODO: 在此添加额外的初始化代码 151103 152104 CDialog::OnInitDialog(); 153105 addr.sin_family = AF_INET; 154106 addr.sin_port = htons(80); 155107 addr.sin_addr.S_un.S_addr = INADDR_ANY; 156108 s = ::socket(AF_INET, SOCK_STREAM, 0); 157109 ::bind(s, (sockaddr*)&addr, sizeof(addr)); 158110 ::listen(s, 5); 159111 GetDlgItem(IDC_TEXT)->EnableWindow(false); 160112 GetDlgItem(IDC_ADDR)->SetWindowText("服务器已经启动"); 161113 162114 ::WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_ACCEPT|FD_READ); 163115 164116 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE 165117 } 166118 167119 void CNew_MFC_TCP_SreverDlg::OnSysCommand(UINT nID, LPARAM lParam) 168120 { 169121 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 170122 { 171123 CAboutDlg dlgAbout; 172124 dlgAbout.DoModal(); 173125 } 174126 else 175127 { 176128 CDialogEx::OnSysCommand(nID, lParam); 177129 } 178130 } 179131 180132 // 如果向对话框添加最小化按钮,则需要下面的代码 181133 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, 182134 // 这将由框架自动完成。 183135 184136 void CNew_MFC_TCP_SreverDlg::OnPaint() 185137 { 186138 if (IsIconic()) 187139 { 188140 CPaintDC dc(this); // 用于绘制的设备上下文 189141 190142 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); 191143 192144 // 使图标在工作区矩形中居中 193145 int cxIcon = GetSystemMetrics(SM_CXICON); 194146 int cyIcon = GetSystemMetrics(SM_CYICON); 195147 CRect rect; 196148 GetClientRect(&rect); 197149 int x = (rect.Width() - cxIcon + 1) / 2; 198150 int y = (rect.Height() - cyIcon + 1) / 2; 199151 200152 // 绘制图标 201153 dc.DrawIcon(x, y, m_hIcon); 202154 } 203155 else 204156 { 205157 CDialogEx::OnPaint(); 206158 } 207159 } 208160 209161 //当用户拖动最小化窗口时系统调用此函数取得光标 210162 //显示。 211163 HCURSOR CNew_MFC_TCP_SreverDlg::OnQueryDragIcon() 212164 { 213165 return static_cast<HCURSOR>(m_hIcon); 214166 } 215167 216168 217169 218170 void CNew_MFC_TCP_SreverDlg::OnEnChangeText() 219171 { 220172 // TODO: 如果该控件是 RICHEDIT 控件,它将不 221173 // 发送此通知,除非重写 CDialogEx::OnInitDialog() 222174 // 函数并调用 CRichEditCtrl().SetEventMask(), 223175 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 224176 225177 // TODO: 在此添加控件通知处理程序代码 226178 } 227179 228180 LRESULT CNew_MFC_TCP_SreverDlg::OnSocket(WPARAM wParam, LPARAM lParam) 229181 { 230182 CString str13; 231183 char cs[100] = { 0 }; 232184 switch (lParam) 233185 { 234186 235187 case FD_ACCEPT: 236188 { 237189 int lenth = sizeof(addr1); 238190 s1 = ::accept(s, (sockaddr*)&addr1, &lenth); 239191 n = n + 1; 240192 str13.Format("有%d客户已经连接上来了", n); 241193 str13 += ::inet_ntoa(addr1.sin_addr); 242194 str13 += "\r\n登录\r\n"; 243195 GetDlgItem(IDC_TEXT)->SetWindowText(str13); 244196 } 245197 246198 break; 247199 248200 case FD_READ: 249201 { 250202 CString num = ""; 251203 ::recv(s1, cs, 100, 0); 252204 GetDlgItem(IDC_TEXT)->GetWindowText(num); 253205 num += "\r\n"; 254206 num += (LPTSTR)::inet_ntoa(addr1.sin_addr); 255207 num += "对您说:"; 256208 num += (LPTSTR)cs; 257209 GetDlgItem(IDC_TEXT)->SetWindowText(num); 258210 } 259211 260212 break; 261213 } 262214 return true; 263215 }