www.pudn.com > ServerClient_Socket.rar > ClientSocketDlg.cpp
// ClientSocketDlg.cpp : implementation file // #include "stdafx.h" #include#include "ServerSocket.h" #include "ClientSocketDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif const int SOCK_TCP = 0; const int SOCK_UDP = 1; ///////////////////////////////////////////////////////////////////////////// // CClientSocketDlg dialog CClientSocketDlg::CClientSocketDlg(CWnd* pParent /*=NULL*/) : CDialog(CClientSocketDlg::IDD, pParent) { //{{AFX_DATA_INIT(CClientSocketDlg) m_strPort = _T("2000"); m_nSockType = SOCK_TCP; // default TCP //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CClientSocketDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CClientSocketDlg) DDX_Control(pDX, IDC_TXT_MESSAGE, m_ctlMessage); DDX_Control(pDX, IDC_SVR_PORTINC, m_ctlPortInc); DDX_Control(pDX, IDC_MESSAGE_LIST, m_ctlMsgList); DDX_Control(pDX, IDC_IPADDRESS, m_ctlIPAddress); DDX_Text(pDX, IDC_SVR_PORT, m_strPort); DDX_Radio(pDX, IDC_TCP, m_nSockType); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CClientSocketDlg, CDialog) //{{AFX_MSG_MAP(CClientSocketDlg) ON_BN_CLICKED(IDC_BTN_START, OnBtnConnect) ON_BN_CLICKED(IDC_BTN_STOP, OnBtnDisconnect) ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend) ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CClientSocketDlg message handlers BOOL CClientSocketDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { int nVirtKey = (int) pMsg->wParam; if (nVirtKey == VK_ESCAPE) return TRUE; if (nVirtKey == VK_RETURN && (GetFocus()->m_hWnd == m_ctlMessage.m_hWnd)) { if (m_SocketManager.IsOpen()) OnBtnSend(); return TRUE; } } return CDialog::PreTranslateMessage(pMsg); } BOOL CClientSocketDlg::OnInitDialog() { ASSERT( GetDlgItem(IDC_BTN_SEND) != NULL ); ASSERT( GetDlgItem(IDC_BTN_START) != NULL ); ASSERT( GetDlgItem(IDC_BTN_STOP) != NULL ); ASSERT( GetDlgItem(IDC_TCP) != NULL ); ASSERT( GetDlgItem(IDC_UDP) != NULL ); CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_ctlPortInc.SetRange32( 2000, 4500); GetDlgItem(IDC_BTN_SEND)->EnableWindow( FALSE ); GetDlgItem(IDC_BTN_STOP)->EnableWindow( FALSE ); CString strLocal; m_SocketManager.GetLocalAddress( strLocal.GetBuffer(256), 256); strLocal.ReleaseBuffer(); m_ctlIPAddress.SetWindowText( strLocal ); // Initialize socket manager m_SocketManager.SetMessageWindow( &m_ctlMsgList ); m_SocketManager.SetServerState( false ); // run as client m_SocketManager.SetSmartAddressing( false ); // always send to server return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CClientSocketDlg::OnBtnConnect() { UpdateData(); CString strServer; m_ctlIPAddress.GetWindowText( strServer ); bool bSuccess; if (m_nSockType == SOCK_TCP) { bSuccess = m_SocketManager.ConnectTo( strServer, m_strPort, AF_INET, SOCK_STREAM); // TCP } else { bSuccess = m_SocketManager.ConnectTo( strServer, m_strPort, AF_INET, SOCK_DGRAM); // UDP } if (bSuccess && m_SocketManager.WatchComm()) { GetDlgItem(IDC_BTN_SEND)->EnableWindow( TRUE ); GetDlgItem(IDC_BTN_STOP)->EnableWindow( TRUE ); NextDlgCtrl(); GetDlgItem(IDC_BTN_START)->EnableWindow( FALSE ); GetDlgItem(IDC_TCP)->EnableWindow( FALSE ); GetDlgItem(IDC_UDP)->EnableWindow( FALSE ); CString strMsg; if (m_nSockType == SOCK_TCP) { strMsg = _T("Connection established with server: ") + strServer; strMsg += _T(" on port ") + m_strPort + CString("\r\n"); m_SocketManager.GetPeerName( m_SockPeer ); } else { SockAddrIn addrin; m_SocketManager.GetSockName( addrin ); // just to get our current address LONG uAddr = addrin.GetIPAddr(); BYTE* sAddr = (BYTE*) &uAddr; short nPort = ntohs( addrin.GetPort() ); CString strAddr; // Address is stored in network format... strAddr.Format(_T("IP: %u.%u.%u.%u, Port: %d"), (UINT)(sAddr[0]), (UINT)(sAddr[1]), (UINT)(sAddr[2]), (UINT)(sAddr[3]), nPort); strMsg = _T("Socket created: ") + strAddr + CString("\r\n"); m_SockPeer.CreateFrom( strServer, m_strPort, AF_INET); } m_ctlMsgList.SetWindowText( strMsg ); } } void CClientSocketDlg::OnBtnDisconnect() { // Disconnect socket m_SocketManager.StopComm(); if (!m_SocketManager.IsOpen()) { GetDlgItem(IDC_BTN_START)->EnableWindow( TRUE ); PrevDlgCtrl(); GetDlgItem(IDC_BTN_SEND)->EnableWindow( FALSE ); GetDlgItem(IDC_BTN_STOP)->EnableWindow( FALSE ); GetDlgItem(IDC_TCP)->EnableWindow( TRUE ); GetDlgItem(IDC_UDP)->EnableWindow( TRUE ); } } void CClientSocketDlg::OnBtnSend() { BYTE byBuffer[256] = { 0 }; CString strText; // Update so that we can retrieve new port number also... :-) UpdateData(); m_ctlMessage.GetWindowText( strText ); int nLen = strText.GetLength(); if (nLen > 0) { strText += _T("\r\n"); nLen = strText.GetLength() + 1; USES_CONVERSION; strcpy((LPSTR)byBuffer, T2CA(strText)); m_SocketManager.WriteComm( byBuffer, nLen, INFINITE); } } void CClientSocketDlg::OnDestroy() { m_SocketManager.StopComm(); CDialog::OnDestroy(); }