Example1Dlg.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:9k
源码类别:

游戏

开发平台:

Visual C++

  1. // Example1Dlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Example1.h"
  5. #include "Example1Dlg.h"
  6. #include "winsock.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CAboutDlg dialog used for App About
  14. class CAboutDlg : public CDialog
  15. {
  16. public:
  17. CAboutDlg();
  18. // Dialog Data
  19. //{{AFX_DATA(CAboutDlg)
  20. enum { IDD = IDD_ABOUTBOX };
  21. //}}AFX_DATA
  22. // ClassWizard generated virtual function overrides
  23. //{{AFX_VIRTUAL(CAboutDlg)
  24. protected:
  25. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  26. //}}AFX_VIRTUAL
  27. // Implementation
  28. protected:
  29. //{{AFX_MSG(CAboutDlg)
  30. //}}AFX_MSG
  31. DECLARE_MESSAGE_MAP()
  32. };
  33. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  34. {
  35. //{{AFX_DATA_INIT(CAboutDlg)
  36. //}}AFX_DATA_INIT
  37. }
  38. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. //{{AFX_DATA_MAP(CAboutDlg)
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  45. //{{AFX_MSG_MAP(CAboutDlg)
  46. // No message handlers
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CExample1Dlg dialog
  51. CExample1Dlg::CExample1Dlg(CWnd* pParent /*=NULL*/)
  52. : CDialog(CExample1Dlg::IDD, pParent)
  53. {
  54. //{{AFX_DATA_INIT(CExample1Dlg)
  55. m_uPort = 4000;
  56. m_sShowText = _T("");
  57. m_sInputText = _T("");
  58. //}}AFX_DATA_INIT
  59. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  60. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  61. }
  62. void CExample1Dlg::DoDataExchange(CDataExchange* pDX)
  63. {
  64. CDialog::DoDataExchange(pDX);
  65. //{{AFX_DATA_MAP(CExample1Dlg)
  66. DDX_Control(pDX, IDC_SERVERIP, m_ServerIp);
  67. DDX_Text(pDX, IDC_PORT, m_uPort);
  68. DDV_MinMaxUInt(pDX, m_uPort, 1024, 100000);
  69. DDX_Text(pDX, IDC_SHOWTEXT, m_sShowText);
  70. DDX_Text(pDX, IDC_INPUTTEXT, m_sInputText);
  71. //}}AFX_DATA_MAP
  72. }
  73. BEGIN_MESSAGE_MAP(CExample1Dlg, CDialog)
  74. //{{AFX_MSG_MAP(CExample1Dlg)
  75. ON_WM_SYSCOMMAND()
  76. ON_WM_PAINT()
  77. ON_WM_QUERYDRAGICON()
  78. ON_BN_CLICKED(IDC_CONNECT, OnConnect)
  79. ON_BN_CLICKED(IDC_SETSERVER, OnSetserver)
  80. ON_EN_UPDATE(IDC_INPUTTEXT,OnInputText)
  81. ON_MESSAGE(SER_MESSAGE,OnServerMessage)
  82. ON_MESSAGE(CLI_MESSAGE,OnClientMessage)
  83. //}}AFX_MSG_MAP
  84. END_MESSAGE_MAP()
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CExample1Dlg message handlers
  87. BOOL CExample1Dlg::OnInitDialog()
  88. {
  89. CDialog::OnInitDialog();
  90. // Add "About..." menu item to system menu.
  91. // IDM_ABOUTBOX must be in the system command range.
  92. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  93. ASSERT(IDM_ABOUTBOX < 0xF000);
  94. CMenu* pSysMenu = GetSystemMenu(FALSE);
  95. if (pSysMenu != NULL)
  96. {
  97. CString strAboutMenu;
  98. strAboutMenu.LoadString(IDS_ABOUTBOX);
  99. if (!strAboutMenu.IsEmpty())
  100. {
  101. pSysMenu->AppendMenu(MF_SEPARATOR);
  102. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  103. }
  104. }
  105. // Set the icon for this dialog.  The framework does this automatically
  106. //  when the application's main window is not a dialog
  107. SetIcon(m_hIcon, TRUE); // Set big icon
  108. SetIcon(m_hIcon, FALSE); // Set small icon
  109. // TODO: Add extra initialization here
  110. WSADATA wsaData;
  111. WORD version = MAKEWORD(2, 0);
  112. int ret = WSAStartup(version, &wsaData);
  113. if(ret != 0)
  114. {
  115. TRACE("Initilize Error!n");  //初始化失败
  116. AfxMessageBox("Failed in initial socket");
  117. }
  118. // m_connectionList.AssertValid();
  119. m_connectionList.RemoveAll();
  120. ASSERT(m_connectionList.GetCount()==0);
  121. m_bInit=FALSE;
  122. m_bClient=FALSE;
  123. return TRUE;  // return TRUE  unless you set the focus to a control
  124. }
  125. void CExample1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
  126. {
  127. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  128. {
  129. CAboutDlg dlgAbout;
  130. dlgAbout.DoModal();
  131. }
  132. else
  133. {
  134. CDialog::OnSysCommand(nID, lParam);
  135. }
  136. }
  137. // If you add a minimize button to your dialog, you will need the code below
  138. //  to draw the icon.  For MFC applications using the document/view model,
  139. //  this is automatically done for you by the framework.
  140. void CExample1Dlg::OnPaint() 
  141. {
  142. if (IsIconic())
  143. {
  144. CPaintDC dc(this); // device context for painting
  145. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  146. // Center icon in client rectangle
  147. int cxIcon = GetSystemMetrics(SM_CXICON);
  148. int cyIcon = GetSystemMetrics(SM_CYICON);
  149. CRect rect;
  150. GetClientRect(&rect);
  151. int x = (rect.Width() - cxIcon + 1) / 2;
  152. int y = (rect.Height() - cyIcon + 1) / 2;
  153. // Draw the icon
  154. dc.DrawIcon(x, y, m_hIcon);
  155. }
  156. else
  157. {
  158. CDialog::OnPaint();
  159. }
  160. }
  161. // The system calls this to obtain the cursor to display while the user drags
  162. //  the minimized window.
  163. HCURSOR CExample1Dlg::OnQueryDragIcon()
  164. {
  165. return (HCURSOR) m_hIcon;
  166. }
  167. void CExample1Dlg::OnConnect() 
  168. {
  169. // TODO: Add your control notification handler code here
  170. BYTE  f0,f1,f2,f3;
  171. m_ServerIp.GetAddress(f0,f1,f2,f3);
  172. CString add;
  173. add.Format("%d.%d.%d.%d",f0,f1,f2,f3);
  174. if(m_client.InitAndConnet(m_hWnd,m_uPort,add)==FALSE)
  175. return;
  176. }
  177. void CExample1Dlg::OnSetserver() 
  178. {
  179. // TODO: Add your control notification handler code here
  180. if(m_server.InitAndListen(this->m_hWnd,m_uPort)==FALSE)
  181. {
  182. return;
  183. }
  184. else
  185. {
  186. m_bInit=TRUE;
  187. m_bClient=FALSE;
  188. m_sShowText="Server has been set ok!n";
  189. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_sShowText);
  190. }
  191. }
  192. //Server消息相应函数
  193. LRESULT CExample1Dlg::OnServerMessage(WPARAM wParam, LPARAM lParam)
  194. {
  195. SOCKET socket,ts;
  196. int length,i,j;
  197. CString str="";
  198. CEdit * output=NULL;
  199. char s[1024];
  200. int len;
  201. switch(lParam)
  202. {
  203. case FD_ACCEPT:
  204. socket= accept(m_server.m_hSocket,NULL,NULL);
  205. length=m_connectionList.GetCount();
  206. for(i=0;i<length;i++)
  207. {
  208. ts=m_connectionList.GetAt(m_connectionList.FindIndex(i));
  209. s[0]=NULL;
  210. strcat(s,"一个游客进入了聊天室");
  211. send(ts,s,strlen(s),0);
  212. }
  213. m_sShowText+="n";
  214. m_sShowText+="一个游客进入了聊天室了";
  215. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_sShowText);
  216. output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  217. //随时跟踪滚动条的位置
  218. output->LineScroll(output->GetLineCount());
  219. m_connectionList.AddHead(socket);
  220. return 0;
  221. case FD_READ:
  222. length=m_connectionList.GetCount();
  223. for(i=0;i<length;i++)
  224. {
  225. socket=m_connectionList.GetAt(m_connectionList.FindIndex(i));
  226. if(socket==wParam)
  227. {
  228. len=recv(socket,s,1024,0);
  229. s[len]=NULL;
  230. //将一个客户端发送的消息传递到其他客户端去
  231. for(j=0;j<length;j++)
  232. {
  233. socket=m_connectionList.GetAt(m_connectionList.FindIndex(j));
  234. if(socket!=wParam)
  235. {
  236. send(socket,s,strlen(s),0);
  237. }
  238. }
  239. m_sShowText=m_sShowText+s;
  240. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_sShowText);
  241. CEdit * output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  242. //随时跟踪滚动条的位置
  243. output->LineScroll(output->GetLineCount());
  244. return 0;
  245. }
  246. }
  247. return 0;
  248. case FD_WRITE:
  249. return 0;
  250. case FD_CLOSE:
  251. return 0;
  252. default:
  253. m_sShowText=m_sShowText+"An networking error has occured with a client";
  254. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_sShowText);
  255. CEdit * output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  256. //随时跟踪滚动条的位置
  257. output->LineScroll(output->GetLineCount());
  258. return 0;
  259. }
  260. }
  261. LRESULT CExample1Dlg::OnClientMessage(WPARAM wParam, LPARAM lParam)
  262. {
  263. CEdit * output=NULL;
  264. char s[1024];
  265. int len;
  266. switch(lParam)
  267. {
  268. case FD_CONNECT:
  269. len=GetLastError();
  270. if(len!=0)
  271. {
  272. AfxMessageBox("Error in Connecting");
  273. }
  274. else
  275. {
  276. m_bInit=TRUE;
  277. m_bClient=TRUE;
  278. m_sShowText="Having connected to server!n";
  279. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_sShowText);
  280. }
  281. return 0;
  282. case FD_READ:
  283. len=recv(m_client.m_hSocket,s,1024,0);
  284. s[len]=NULL;
  285. m_sShowText+=s;
  286. //随时跟踪滚动条的位置 
  287. output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  288. output->SetWindowText(m_sShowText);
  289. output->LineScroll(output->GetLineCount());
  290. return 0;
  291. case FD_WRITE:
  292. return 0;
  293. case FD_CLOSE:
  294. return 0;
  295. default:
  296. output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  297. output->SetWindowText("An network error has occured,the connection is dropped");
  298. closesocket(m_client.m_hSocket);
  299. m_bInit=false;
  300. return 0;
  301. }
  302. }
  303. void CExample1Dlg::OnInputText()
  304. {
  305. if(!m_bInit)
  306. {
  307. AfxMessageBox("The session has not been set correctly");
  308. return;
  309. }
  310. CString in;
  311. GetDlgItem(IDC_INPUTTEXT)->GetWindowText(in);
  312. //输入框中只有回车键被按下,所以不发送回车键字符
  313. if(in.GetLength()<1)
  314. {
  315. return;
  316. }
  317. if(in.GetAt(in.GetLength()-1)=='n')
  318. {
  319. //in.TrimRight(" ")用来消去无用的空格键字符
  320. in.TrimRight(" ");
  321. //将输入框中的字符清空,表示字符已经被发送
  322. GetDlgItem(IDC_INPUTTEXT)->SetWindowText("");
  323. if(in.GetLength()>2)
  324. {
  325. m_sShowText+=in;
  326. //将输入的话显示到显示窗口中
  327. GetDlgItem(IDC_SHOWTEXT)->SetWindowText(m_sShowText);
  328. CEdit * output=(CEdit *)GetDlgItem(IDC_SHOWTEXT);
  329. //随时跟踪滚动条的位置
  330. output->LineScroll(output->GetLineCount());
  331. //服务器端
  332. if(!m_bClient)
  333. {
  334. int length=m_connectionList.GetCount();
  335. SOCKET  socket;
  336. for(int i=0;i<length;i++)
  337. {
  338. socket=m_connectionList.GetAt(m_connectionList.FindIndex(i));
  339. send(socket,in.GetBuffer(0),in.GetLength(),0);
  340. }
  341. }
  342. //客户端
  343. else
  344. {
  345. m_client.SendString(in);
  346. }
  347. }
  348. }
  349. }