网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
使用MFC快速实现网络编程
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

福州大学 王骏

---- 随着计算机网络化的深入,计算机网络编程在程序设计的过程中变得日益重要。由于C++语言对底层操作的优越性,许多文章都曾经介绍过用VC++进行Socket编程的方法。但由于都是直接利用动态连接库wsock32.dll进行操作,实现比较繁琐。其实,VC++的MFC类库中提供了CAsyncSocket这样一个套接字类,用他来实现Socket编程,是非常方便的。

---- 本文将用一个Echo例程来介绍CAsyncSocket类的用法。

---- 一. 客户端

---- 1. 创建一个Dialog Based项目:CSockClient。

---- 2. 设计对话框

---- 去掉Ok和Cancle两个按钮,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。

Control ID Type Member
    
IDC_EDITMSG CEdit m_MSG
IDC_LISTMSG ClistBox m_MSGS

---- 3. CAsyncSocket类用DoCallBack函数处理MFC消息,当一个网络事件发生时,DoCallBack函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect函数。由于MFC把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下:

---- 以Public方式继承CAsyncSocket类,生成新类MySock;

---- 为MySock类添加虚函数OnReceive、OnConnect、OnSend

---- 4. 在MySock.ccp中添加以下代码

#include "CSockClient.h"
#include "CSockClientDlg.h"

---- 5. 在MySock.h中添加以下代码

public:
    BOOL m_bConnected;  //是否连接
    UINT m_nLength;      //消息长度
    char m_szBuffer[4096];  //消息缓冲区

---- 6. 在MySock.ccp中重载各函数

MySock::MySock()
{
m_nLength=0;
memset(m_szBuffer,0,sizeof(m_szBuffer));
m_bConnected=FALSE;
}

MySock::~MySock()
{
//关闭套接字
if(m_hSocket!=INVALID_SOCKET)
    Close();
}

void MySock::OnReceive(int nErrorCode)
{
m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);
//下面两行代码用来获取对话框指针
CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();
CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- >m_pMainWnd;
pDlg- >m_MSGS.InsertString(0,m_szBuffer);
memset(m_szBuffer,0,sizeof(m_szBuffer));
CAsyncSocket::OnReceive(nErrorCode);
}

void MySock::OnSend(int nErrorCode)
{
Send(m_szBuffer,m_nLength,0);
m_nLength=0;
memset(m_szBuffer,0,sizeof(m_szBuffer));
//继续提请一个“读”的网络事件,接收Server消息
AsyncSelect(FD_READ);
CAsyncSocket::OnSend(nErrorCode);
}

void MySock::OnConnect(int nErrorCode)
{
if (nErrorCode==0)
{
    m_bConnected=TRUE;
    CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();
    CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- >m_pMainWnd;
    memcpy(m_szBuffer,"Connected to ",13);
    strncat(m_szBuffer,pDlg- >m_szServerAdr,
        sizeof(pDlg- >m_szServerAdr));
    pDlg- >m_MSGS.InsertString(0,m_szBuffer);
    AsyncSelect(

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号