1 ///////////////////////////////////////
\r
5 #include "ClientDialog.h"
\r
6 #include "resource.h"
\r
9 // Definitions for the CMyDialog class
\r
10 CClientDialog::CClientDialog(UINT nResID, CWnd* pParent) :
\r
11 CDialog(nResID, pParent), m_bClientConnected(FALSE), m_SocketType(SOCK_STREAM)
\r
13 // Add support for the IP Address control
\r
14 // It requires Win95 with IE4 intergrated or a later version of Windows OS.
\r
15 LoadCommonControlsEx();
\r
18 CClientDialog::~CClientDialog()
\r
22 void CClientDialog::Append(int nID, LPCTSTR buf)
\r
24 // This function appends text to an edit control
\r
27 int ndx = (int)SendDlgItemMessage(nID, WM_GETTEXTLENGTH, 0, 0);
\r
30 SendDlgItemMessage(nID, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
\r
31 SendDlgItemMessage(nID, EM_REPLACESEL, 0, (LPARAM) (_T("\r\n")));
\r
35 ndx = (int)SendDlgItemMessage(nID, WM_GETTEXTLENGTH, 0, 0);
\r
36 SendDlgItemMessage(nID, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
\r
37 SendDlgItemMessage(nID, EM_REPLACESEL, 0, (LPARAM) buf);
\r
40 INT_PTR CClientDialog::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
47 case USER_DISCONNECT:
\r
48 OnClientDisconnect();
\r
54 // Give focus to the Send Edit box
\r
55 SendMessage(WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE);
\r
62 // Pass unhandled messages on to parent DialogProc
\r
63 return DialogProcDefault(uMsg, wParam, lParam);
\r
66 void CClientDialog::OnClientDisconnect()
\r
68 // Called when the socket is disconnected from the server
\r
69 m_bClientConnected = FALSE;
\r
70 m_ButtonConnect.EnableWindow( TRUE );
\r
72 // Update the dialog
\r
73 m_EditStatus.SetWindowText( _T("Disconnected from server") );
\r
74 m_ButtonSend.EnableWindow( FALSE );
\r
75 m_EditSend.EnableWindow( FALSE );
\r
76 m_EditPort.EnableWindow( TRUE );
\r
77 m_IP4Address.EnableWindow( TRUE );
\r
78 m_RadioTCP.EnableWindow( TRUE );
\r
79 m_RadioUDP.EnableWindow( TRUE );
\r
80 m_RadioIP4.EnableWindow( TRUE );
\r
81 m_ButtonConnect.SetWindowText( _T("Connect") );
\r
82 if ( m_Client.IsIPV6Supported() )
\r
84 m_EditIP6Address.EnableWindow( TRUE );
\r
85 m_RadioIP6.EnableWindow( TRUE );
\r
89 void CClientDialog::LoadCommonControlsEx()
\r
91 // This function adds support for the IP address control in the dialog.
\r
96 // Load the Common Controls DLL
\r
97 hComCtl = ::LoadLibrary(_T("COMCTL32.DLL"));
\r
99 throw CWinException(_T("Failed to load COMCTL32.DLL"));
\r
101 if (GetComCtlVersion() > 470)
\r
103 // Declare a pointer to the InItCommonControlsEx function
\r
104 typedef BOOL WINAPI INIT_EX(INITCOMMONCONTROLSEX*);
\r
105 INIT_EX* pfnInit = (INIT_EX*)::GetProcAddress(hComCtl, "InitCommonControlsEx");
\r
107 // Call InitCommonControlsEx
\r
108 INITCOMMONCONTROLSEX InitStruct;
\r
109 InitStruct.dwSize = sizeof(INITCOMMONCONTROLSEX);
\r
110 InitStruct.dwICC = ICC_INTERNET_CLASSES;
\r
111 if((!(*pfnInit)(&InitStruct)))
\r
112 throw CWinException(_T("InitCommonControlsEx failed"));
\r
116 ::MessageBox(NULL, _T("IP Address Control not supported!"), _T("Error"), MB_OK);
\r
119 ::FreeLibrary(hComCtl);
\r
122 catch (const CWinException &e)
\r
126 ::FreeLibrary(hComCtl);
\r
131 void CClientDialog::OnClientConnect()
\r
133 // Called when the connection to the server is established
\r
134 m_bClientConnected = TRUE;
\r
135 m_ButtonConnect.EnableWindow( TRUE );
\r
137 // Move focus to the Send Edit box
\r
138 SendMessage(WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE);
\r
139 SetForegroundWindow();
\r
141 // Update the dialog
\r
142 m_IP4Address.EnableWindow( FALSE );
\r
143 m_EditIP6Address.EnableWindow( FALSE );
\r
144 m_ButtonSend.EnableWindow( TRUE );
\r
145 m_EditSend.EnableWindow( TRUE );
\r
146 m_EditPort.EnableWindow( FALSE );
\r
147 m_RadioIP4.EnableWindow( FALSE );
\r
148 m_RadioIP6.EnableWindow( FALSE );
\r
149 m_RadioTCP.EnableWindow( FALSE );
\r
150 m_RadioUDP.EnableWindow( FALSE );
\r
151 m_EditStatus.SetWindowText( _T("Connected to server") );
\r
152 m_ButtonConnect.SetWindowText( _T("Disconnect") );
\r
155 int CClientDialog::OnClientReceive()
\r
157 // Called when the socket has data to receive
\r
158 std::vector<TCHAR> vTChar( 1025, _T('\0') );
\r
159 TCHAR* buf = &vTChar.front(); // TChar array with 1025 elements initialised to _T('\0')
\r
160 int size = m_Client.Receive( buf, 1024, 0 ); // receive at most 1024 chars
\r
161 if (SOCKET_ERROR == size)
\r
163 Append( IDC_EDIT_STATUS, _T("Receive failed.") );
\r
167 Append( IDC_EDIT_RECEIVE, buf );
\r
171 BOOL CClientDialog::OnCommand(WPARAM wParam, LPARAM lParam)
\r
173 // Respond to the dialog buttons
\r
175 UNREFERENCED_PARAMETER(lParam);
\r
177 switch (LOWORD(wParam))
\r
179 case IDC_BUTTON_CONNECT:
\r
182 case IDC_BUTTON_SEND:
\r
184 // Give keyboard focus to the Send edit box
\r
185 SendMessage( WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE);
\r
187 } //switch (LOWORD(wParam))
\r
192 BOOL CClientDialog::OnInitDialog()
\r
195 SetIconLarge(IDW_MAIN);
\r
196 SetIconSmall(IDW_MAIN);
\r
198 // reposition dialog
\r
199 CRect rc = GetWindowRect();
\r
200 MoveWindow( rc.left+14, rc.top+14, rc.Width(), rc.Height(), TRUE);
\r
202 // Attach CWnd objects to the dialog's children
\r
203 m_IP4Address.AttachDlgItem( IDC_IPADDRESS, this );
\r
204 m_EditIP6Address.AttachDlgItem( IDC_EDIT_IPV6ADDRESS, this );
\r
205 m_EditStatus.AttachDlgItem( IDC_EDIT_STATUS, this );
\r
206 m_EditPort.AttachDlgItem( IDC_EDIT_PORT, this );
\r
207 m_EditSend.AttachDlgItem( IDC_EDIT_SEND, this );
\r
208 m_EditReceive.AttachDlgItem( IDC_EDIT_RECEIVE, this );
\r
209 m_ButtonConnect.AttachDlgItem( IDC_BUTTON_CONNECT, this );
\r
210 m_ButtonSend.AttachDlgItem( IDC_BUTTON_SEND, this );
\r
211 m_RadioIP4.AttachDlgItem( IDC_RADIO_IPV4, this );
\r
212 m_RadioIP6.AttachDlgItem( IDC_RADIO_IPV6, this );
\r
213 m_RadioTCP.AttachDlgItem( IDC_RADIO_TCP, this );
\r
214 m_RadioUDP.AttachDlgItem( IDC_RADIO_UDP, this );
\r
216 // Set the initial state of the dialog
\r
217 m_EditIP6Address.SetWindowText( _T("0000:0000:0000:0000:0000:0000:0000:0001") );
\r
218 m_RadioIP4.SendMessage( BM_SETCHECK, BST_CHECKED, 0 );
\r
219 m_EditStatus.SetWindowText( _T("Not Connected") );
\r
220 m_EditPort.SetWindowText( _T("3000") );
\r
221 m_RadioTCP.SendMessage( BM_SETCHECK, BST_CHECKED, 0 );
\r
222 m_IP4Address.SendMessage( IPM_SETADDRESS, 0, MAKEIPADDRESS(127, 0, 0, 1) );
\r
224 if (!m_Client.IsIPV6Supported())
\r
226 m_RadioIP6.EnableWindow(FALSE);
\r
227 m_EditIP6Address.EnableWindow(FALSE);
\r
233 void CClientDialog::OnStartClient()
\r
235 TRACE(_T("Connect/Disconnect Button Pressed\n"));
\r
237 LRESULT lr = m_RadioTCP.SendMessage( BM_GETCHECK, 0, 0 );
\r
238 m_SocketType = (lr == BST_CHECKED)? SOCK_STREAM : SOCK_DGRAM ;
\r
240 lr = m_RadioIP4.SendMessage( BM_GETCHECK, 0, 0 );
\r
241 int IPfamily = (lr == BST_CHECKED)? PF_INET : PF_INET6 ;
\r
243 if (!m_bClientConnected)
\r
245 switch(m_SocketType)
\r
249 // Create the socket
\r
251 if (!m_Client.Create(IPfamily, SOCK_STREAM))
\r
253 Append(IDC_EDIT_STATUS, m_Client.GetLastError());
\r
254 MessageBox( _T("Failed to create Client socket"), _T("Connect Failed"), MB_ICONWARNING );
\r
258 // Retrieve the IP Address
\r
260 if (PF_INET6 == IPfamily)
\r
262 strAddr = m_EditIP6Address.GetWindowText();
\r
267 m_IP4Address.SendMessage( IPM_GETADDRESS, 0, (LPARAM) (LPDWORD) &dwAddr );
\r
268 in_addr addr = {0};
\r
269 addr.S_un.S_addr = htonl(dwAddr);
\r
270 strAddr = A2T( inet_ntoa(addr) );
\r
273 // Retrieve the local port number
\r
274 CString strPort = m_EditPort.GetWindowText();
\r
276 // Temporarily disable the Connect/Disconnect button
\r
277 m_ButtonConnect.EnableWindow(FALSE);
\r
279 // Connect to the server
\r
280 if (0 != m_Client.Connect(strAddr, strPort) )
\r
282 Append(IDC_EDIT_STATUS, m_Client.GetLastError());
\r
283 MessageBox( _T("Failed to connect to server. Is it started?"), _T("Connect Failed"), MB_ICONWARNING );
\r
284 m_Client.Disconnect();
\r
285 m_ButtonConnect.EnableWindow( TRUE );
\r
288 m_Client.StartEvents();
\r
295 // Create the socket
\r
296 if (!m_Client.Create(IPfamily, SOCK_DGRAM))
\r
298 Append(IDC_EDIT_STATUS, m_Client.GetLastError());
\r
299 MessageBox( _T("Failed to create Client socket"), _T("Connect Failed"), MB_ICONWARNING );
\r
303 m_Client.StartEvents();
\r
305 //Update the dialog
\r
306 m_IP4Address.EnableWindow( FALSE );
\r
307 m_EditIP6Address.EnableWindow( FALSE );
\r
308 m_ButtonSend.EnableWindow( TRUE );
\r
309 m_EditSend.EnableWindow( TRUE );
\r
310 m_EditPort.EnableWindow( FALSE );
\r
311 m_RadioIP4.EnableWindow( FALSE );
\r
312 m_RadioIP6.EnableWindow( FALSE );
\r
313 m_RadioTCP.EnableWindow( FALSE );
\r
314 m_RadioUDP.EnableWindow( FALSE );
\r
315 m_ButtonConnect.SetWindowText( _T("Disconnect") );
\r
316 m_EditStatus.SetWindowText( _T("Ready to Send") );
\r
317 SendMessage( WM_NEXTDLGCTL, (WPARAM)(HWND)m_EditSend, TRUE );
\r
318 m_bClientConnected = TRUE;
\r
325 // Shutdown and close the client socket
\r
326 m_Client.Disconnect();
\r
328 // Update the dialog
\r
329 m_IP4Address.EnableWindow( TRUE );
\r
330 m_ButtonSend.EnableWindow( FALSE );
\r
331 m_EditSend.EnableWindow( FALSE );
\r
332 m_EditPort.EnableWindow( TRUE );
\r
333 m_RadioIP4.EnableWindow( TRUE );
\r
334 m_RadioTCP.EnableWindow( TRUE );
\r
335 m_RadioUDP.EnableWindow( TRUE );
\r
336 m_ButtonConnect.SetWindowText( _T("Connect") );
\r
337 m_EditStatus.SetWindowText( _T("Not Connected") );
\r
339 if (m_Client.IsIPV6Supported())
\r
341 m_RadioIP6.EnableWindow(TRUE);
\r
342 m_EditIP6Address.EnableWindow(TRUE);
\r
344 m_bClientConnected = FALSE;
\r
348 void CClientDialog::OnSend()
\r
350 switch (m_SocketType)
\r
352 case SOCK_STREAM: // for TCP client
\r
354 CString sSend = GetDlgItemText(IDC_EDIT_SEND);
\r
355 if (SOCKET_ERROR == m_Client.Send(sSend, sSend.GetLength(), 0))
\r
356 m_EditStatus.SetWindowText( _T("Send Failed") );
\r
359 case SOCK_DGRAM: // for UDP client
\r
361 LRESULT lr = m_RadioIP4.SendMessage( BM_GETCHECK, 0, 0 );
\r
362 int IPfamily = (lr == BST_CHECKED)? PF_INET : PF_INET6 ;
\r
364 CString strPort = m_EditPort.GetWindowText();
\r
365 CString strSend = m_EditSend.GetWindowText();
\r
367 // Retrieve the IP Address
\r
369 if (PF_INET6 == IPfamily)
\r
371 strAddr = m_EditIP6Address.GetWindowText();
\r
376 m_IP4Address.SendMessage( IPM_GETADDRESS, 0, (LPARAM) (LPDWORD) &dwAddr );
\r
377 in_addr addr = {0};
\r
378 addr.S_un.S_addr = htonl(dwAddr);
\r
379 strAddr = A2T( inet_ntoa(addr) );
\r
382 if (SOCKET_ERROR == m_Client.SendTo( strSend, strSend.GetLength(), 0, strAddr, strPort ))
\r
383 m_EditStatus.SetWindowText( _T("SendTo Failed") );
\r