|  | 
 
| ATL对话框异步Socket通信实现,包含客户端/服务端完整交互功能 代码说明:1.完整实现客户端/服务端通信 2.使用自定义消息处理Socket事件 3.对话框实时显示通信内容 4.支持多客户端连接
 ClientSocket.h
 
 ServerSocket.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;
};
 MainDlg.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.cpp复制代码 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;
};
 复制代码#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;
}
 
 | 
 |