|
ATL对话框异步Socket通信实现,包含客户端/服务端完整交互功能
代码说明:1.完整实现客户端/服务端通信 2.使用自定义消息处理Socket事件 3.对话框实时显示通信内容 4.支持多客户端连接
ClientSocket.h
- #pragma once
- #include <atlbase.h>
- #include <atlwin.h>
- #include <atlcoll.h>
- #define WM_SOCKET_MSG (WM_USER + 100)
- class CClientSocket : public CAsyncSocket {
- public:
- void SetMsgWindow(HWND hWnd) { m_hMsgWnd = hWnd; }
-
- BOOL ConnectToServer(LPCTSTR szAddress, UINT nPort) {
- if(!Create()) return FALSE;
- return Connect(szAddress, nPort);
- }
- void SendData(const CString& strData) {
- if(GetState() == connected) {
- Send(CT2A(strData), strData.GetLength());
- }
- }
- protected:
- virtual void OnReceive(int nErrorCode) {
- if(nErrorCode == 0) {
- char szBuffer[4096];
- int nRead = Receive(szBuffer, sizeof(szBuffer)-1);
- if(nRead > 0 && m_hMsgWnd) {
- szBuffer[nRead] = '\0';
- ::PostMessage(m_hMsgWnd, WM_SOCKET_MSG, 0, (LPARAM)new CString(CA2T(szBuffer)));
- }
- }
- CAsyncSocket::OnReceive(nErrorCode);
- }
- private:
- HWND m_hMsgWnd = NULL;
- };
复制代码 ServerSocket.h
- #pragma once
- #include <atlbase.h>
- class CServerSocket : public CAsyncSocket {
- public:
- void StartServer(UINT nPort) {
- Create(nPort);
- Listen();
- }
- virtual void OnAccept(int nErrorCode) {
- if(nErrorCode == 0) {
- CClientSocket* pSocket = new CClientSocket;
- if(Accept(*pSocket)) {
- pSocket->AsyncSelect(FD_READ | FD_CLOSE);
- }
- }
- }
- };
复制代码 MainDlg.h
- once
- #include "ClientSocket.h"
- #include "ServerSocket.h"
- class CMainDlg : public CDialogImpl<CMainDlg> {
- public:
- enum { IDD = IDD_MAINDLG };
- BEGIN_MSG_MAP(CMainDlg)
- MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
- COMMAND_ID_HANDLER(IDC_BTN_CONNECT, OnConnect)
- COMMAND_ID_HANDLER(IDC_BTN_SEND, OnSend)
- COMMAND_ID_HANDLER(IDC_BTN_START_SERVER, OnStartServer)
- MESSAGE_HANDLER(WM_SOCKET_MSG, OnSocketMessage)
- END_MSG_MAP()
- LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&);
- LRESULT OnConnect(WORD, WORD, HWND, BOOL&);
- LRESULT OnSend(WORD, WORD, HWND, BOOL&);
- LRESULT OnStartServer(WORD, WORD, HWND, BOOL&);
- LRESULT OnSocketMessage(UINT, WPARAM, LPARAM, BOOL&);
- private:
- void AppendMessage(LPCTSTR lpszMessage);
- CClientSocket m_clientSocket;
- CServerSocket m_serverSocket;
- };
复制代码 MainDlg.cpp
- #include "stdafx.h"
- #include "MainDlg.h"
- LRESULT CMainDlg::OnInitDialog(UINT, WPARAM, LPARAM, BOOL&) {
- CenterWindow();
- m_clientSocket.SetMsgWindow(m_hWnd);
- return TRUE;
- }
- void CMainDlg::AppendMessage(LPCTSTR lpszMessage) {
- CString strCurrent;
- GetDlgItemText(IDC_EDIT_RECV, strCurrent);
- strCurrent += lpszMessage;
- strCurrent += _T("\r\n");
- SetDlgItemText(IDC_EDIT_RECV, strCurrent);
- }
- LRESULT CMainDlg::OnSocketMessage(UINT, WPARAM, LPARAM lParam, BOOL&) {
- CString* pStr = reinterpret_cast<CString*>(lParam);
- if(pStr) {
- AppendMessage(*pStr);
- delete pStr;
- }
- return 0;
- }
- LRESULT CMainDlg::OnConnect(WORD, WORD, HWND, BOOL&) {
- CString strAddr;
- GetDlgItemText(IDC_EDIT_ADDRESS, strAddr);
- UINT nPort = GetDlgItemInt(IDC_EDIT_PORT);
-
- if(m_clientSocket.ConnectToServer(strAddr, nPort)) {
- AppendMessage(_T("连接服务器成功"));
- }
- return 0;
- }
- LRESULT CMainDlg::OnSend(WORD, WORD, HWND, BOOL&) {
- CString strMsg;
- GetDlgItemText(IDC_EDIT_MESSAGE, strMsg);
- m_clientSocket.SendData(strMsg);
- AppendMessage(_T("发送: ") + strMsg);
- return 0;
- }
- LRESULT CMainDlg::OnStartServer(WORD, WORD, HWND, BOOL&) {
- UINT nPort = GetDlgItemInt(IDC_EDIT_SERVER_PORT);
- if(m_serverSocket.StartServer(nPort)) {
- AppendMessage(_T("服务器启动成功,监听端口: ") + CString(nPort));
- }
- return 0;
- }
复制代码
|
|