如题
谁有VC++的基于MFC对话框的Socket通讯的代码,主要是完成服务器和客户端的发送和接受数据。
服务器和客户端都有连接,发送,接受等按钮和一个文本显示发送和接受的数据
如果您有相关代码请发到

解决方案 »

  1.   

    http://download.csdn.net/source/1174795
      

  2.   

    以前写过一份UDP的SOCKET服务端 客户端要的话短信我 我Email给你
      

  3.   

    这是我写的客户端的代码,请大侠指示。界面很简单,就是4个按钮,连接,发送,接收和断开,一个文本显示发送接受的数据。// ClientDlg.cpp : 实现文件
    //#include "stdafx.h"
    #include "Client.h"
    #include "ClientDlg.h"
    #include "afxdialogex.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    // CClientDlg 对话框
    CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CClientDlg::IDD, pParent)
        , m_strEdtData(_T(""))
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        m_nPort = 5025;
        m_strIPAdde = "127.0.0.1";
    }void CClientDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDT_DATA, m_strEdtData);
    }BEGIN_MESSAGE_MAP(CClientDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
        ON_WM_DESTROY()
        ON_BN_CLICKED(IDC_BTN_CONNECT, &CClientDlg::OnBnClickedBtnConnect)
        ON_BN_CLICKED(IDC_BTN_SEND, &CClientDlg::OnClickedBtnSend)
        ON_BN_CLICKED(IDC_BTN_REVC, &CClientDlg::OnClickedBtnRevc)
        ON_BN_CLICKED(IDC_BTN_EXIT, &CClientDlg::OnClickedBtnExit)
    END_MESSAGE_MAP()
    // CClientDlg 消息处理程序BOOL CClientDlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CClientDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialogEx::OnPaint();
    }
    }//当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CClientDlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }bool CClientDlg::InitSendSocket()
    {
        if (!m_sockSend.Create(m_nPort, SOCK_DGRAM, NULL))
        {
            AfxMessageBox(_T("Send Create Failed!"));
            return FALSE;
        }
        
        if (SOCKET_ERROR == m_sockSend.Bind(m_nPort, m_strIPAdde))
        {
            AfxMessageBox(_T("Send Bind Failed!"));
            return FALSE;
        }
        return TRUE;
    }bool CClientDlg::InitRecvSocket()
    {
        if (!m_sockRecv.Create())
        {
            AfxMessageBox(_T("Recv Create Failed!"));
            return FALSE;
        }    if (!m_sockRecv.Connect(m_strIPAdde, m_nPort))
        {
            AfxMessageBox(_T("Recv Connect Failed!"));
            return FALSE;
        }    return TRUE;
    }void CClientDlg::OnBnClickedBtnConnect()
    {
        // TODO: Add your control notification handler code here
        UnInitSocket();
        InitSendSocket();
        InitRecvSocket();
    }
    void CClientDlg::OnClickedBtnSend()
    {
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);    m_sockSend.SendTo(m_strEdtData, m_strEdtData.GetLength(), m_nPort, m_strIPAdde, 0);
    }
    void CClientDlg::OnClickedBtnRevc()
    {
        // TODO: Add your control notification handler code here
        char szRecv[256];    int nRecv = m_sockRecv.Receive(szRecv, 256, 0);    if (nRecv > 0)
        {
            m_strEdtData.Format(_T("%s"), szRecv);
            UpdateData(FALSE);
        }
    }
    void CClientDlg::OnClickedBtnExit()
    {
        // TODO: Add your control notification handler code here
        UnInitSocket();
    }void CClientDlg::UnInitSocket()
    {
        if (NULL != m_sockRecv)
        {
            m_sockRecv.Close();
        }    if (NULL != m_sockSend)
        {
            m_sockSend.Close();
        }
    }void CClientDlg::OnDestroy()
    {
        CDialogEx::OnDestroy();    // TODO: Add your message handler code here
        UnInitSocket();
    }
      

  4.   

    服务器端界面通客户端,代码如下// ServerDlg.cpp : 实现文件
    //#include "stdafx.h"
    #include "Server.h"
    #include "ServerDlg.h"
    #include "afxdialogex.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    // CServerDlg 对话框
    CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CServerDlg::IDD, pParent)
        , m_strEdtData(_T(""))
    {
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        m_nPort = 5025;
        m_strIPAddr = "127.0.0.1";
    }void CServerDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDT_DATA, m_strEdtData);
    }BEGIN_MESSAGE_MAP(CServerDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_BTN_CONNECT, &CServerDlg::OnClickedBtnConnect)
        ON_BN_CLICKED(IDC_BTN_EXIT, &CServerDlg::OnClickedBtnExit)
        ON_BN_CLICKED(IDC_BTN_RECV, &CServerDlg::OnClickedBtnRecv)
        ON_BN_CLICKED(IDC_BTN_SEND, &CServerDlg::OnClickedBtnSend)
    END_MESSAGE_MAP()
    // CServerDlg 消息处理程序BOOL CServerDlg::OnInitDialog()
    {
    CDialogEx::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE); // 设置大图标
    SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }// 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。void CServerDlg::OnPaint()
    {
    if (IsIconic())
    {
    CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
    int cxIcon = GetSystemMetrics(SM_CXICON);
    int cyIcon = GetSystemMetrics(SM_CYICON);
    CRect rect;
    GetClientRect(&rect);
    int x = (rect.Width() - cxIcon + 1) / 2;
    int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
    dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
    CDialogEx::OnPaint();
    }
    }//当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CServerDlg::OnQueryDragIcon()
    {
    return static_cast<HCURSOR>(m_hIcon);
    }void CServerDlg::OnClickedBtnConnect()
    {
        // TODO: Add your control notification handler code here
        UnInitSocket();
        InitSocketSend();
        InitSocketRecv();
    }
    void CServerDlg::OnClickedBtnExit()
    {
        // TODO: Add your control notification handler code here
        UnInitSocket();
    }
    void CServerDlg::OnClickedBtnRecv()
    {
        // TODO: Add your control notification handler code here
        char szRecv[256];
        m_sockRecv.ReceiveFrom(szRecv, 256, m_strIPAddr, m_nPort, 0);
        m_strEdtData = szRecv;
        UpdateData(FALSE);
    }
    void CServerDlg::OnClickedBtnSend()
    {
        // TODO: Add your control notification handler code here
        UpdateData(TRUE);
        m_sockSend.Send(m_strEdtData, 256, 0);
    }void CServerDlg::UnInitSocket()
    {
        if (NULL != m_sockRecv)
        {
            m_sockRecv.Close();
        }    if (NULL != m_sockSend)
        {
            m_sockSend.Close();
        }
    }bool CServerDlg::InitSocketSend()
    {
        CSocket sockListen;
        if (sockListen.Create(m_nPort, SOCK_STREAM, m_strIPAddr))
        {
            AfxMessageBox(_T("Listen Create Failed!"));
            return FALSE;
        }    if (SOCKET_ERROR == sockListen.Bind(m_nPort, m_strIPAddr))
        {
            AfxMessageBox(_T("Listen Bind Failed!"));
            return FALSE;
        }    sockListen.Listen(5);    sockListen.Accept(m_sockSend);
        sockListen.Close();    return TRUE;
    }bool CServerDlg::InitSocketRecv()
    {
        if ( m_sockRecv.Create(m_nPort, SOCK_DGRAM, m_strIPAddr))
        {
            AfxMessageBox(_T("Recv Create Failed!"));
            return FALSE;
        }    if (SOCKET_ERROR == m_sockRecv.Bind(m_nPort, m_strIPAddr))
        {
            AfxMessageBox(_T("Recv Bind Failed!"));
            return FALSE;
        }    return TRUE;
        
    }