VC++ MFC Socket网络编程

本文介绍了如何使用MFC的CAsyncSocket和CSocket类进行Socket编程,创建C/S模式的网络程序。通过详细步骤展示了客户端ChatClient和服务器端chatServer的创建过程,包括对话框模块的建立、控件关联、事件处理函数的编写。通过源码分析,阐述了从单向通信到双向交流的实现方法。
摘要由CSDN通过智能技术生成

一.MFC中的Socket类

  1. CAsyncSocket类
    CAsyncSocket类是从MFC的根类CObject派生出来的,它在较低的级别上封装Windows Socket API。
    CAsyncSocket类在MFC套接字类中的继承位置如图2.2所示。
    CAsyncSocket类的成员函数如表2.1所示。
    在这里插入图片描述
    2.CSocket类及其相关类
    (1)CSocket类。
    CSocket类是从CAsyncSocket派生而来的,它继承了CAsyncSocket对Windows Socket API的封装。
    (2)CSocket与CArchive、CSocketFile类的配合使用。
    用CSocket类编写网络程序,既可以使用如CAsyncSocket类网络程序一样的Send和Receive函数来收发信息,也可以与CSocketFile类和CArchive类一起来管理对数据的发送和接收。

二.C/S模式下网络程序的Socket通信实例

1.客户—服务器方式(C/S模式)
(1).网络软件的通用体系结构
客户(Client)和服务器(Server)是指通信中所涉及的两个应用进程。客户—服务器方式所描述的是进程之间服务和被服务的关系。在图2.3中,主机A运行客户程序而主机B运行服务器程序。
在这里插入图片描述

三.客户—服务器方式(C/S模式)

1.最简单的Socket通信流程:
在这里插入图片描述
2.对象分析:
由Socket通信流程可见,要实现这样一个完整流程需要三个套接字对象:客户端一个(我们称为“客户Socket”),服务器端两个(一个用于监听,称为“监听Socket”;另一个用于接收客户发来的信息,称为“服务Socket”),这三个套接字对象对应三个Socket类,都继承自CAsyncSocket,分别给它们取名如表:

| Socket对象 |     类    名  |
|客户Socket  |CClientSocket  |
|监听Socket  | CListenSocket |
|服务Socket  |CServerSocket  |

作为一个初学者,深感Socket编程入门的困难,但当把一些问题弄懂之后,回过头来看以前遇到的一些问题,才发现 Socket编程其实并没有那么复杂。接下来我就把我遇到的一些困难讲述下,并补上解决的办法。首先我们要想实现一个简单的点对点网络通信,就应该有一个客户和一个服务器我们先来做客户端。先按照如下图所示建立好客户对话框模块:

四.客服端对话框ChatClient模块

(1)首先创建一个基于MFC AppWizard[EXE] 工程,工程名为ChatClient,接着一直单击“下一步”按钮,在设置勾选“基于对话框”以及高级功能里面“windows 套接字”如图所示。
在这里插入图片描述
(2)建立如图所示的客户端对话框完成的客户端简化界面(如图所示)上,包括IP地址控件、列表框各1个,文本框两个,四个按钮。
在这里插入图片描述
(3)各控件关联的变量属性如图:
在这里插入图片描述

现在模块已经建好了,接下来就是写代码了,不过写代码之前我们要先理清思路。客户端与服务器是怎样来实现通信的呢,其实就是由数据的发送者客户端将要发送的信息写入一个套接字,在通过中间环节传输到接收端服务器的套接字中,就可以由接收端的应用程序将套接字从中取出。因此,两个应用程序间的数据传输要通过套接字来完成,至于两个套接字间是怎么传输的我们就不要管了,我们只要把信息装入套接字中就可以了。
作为一个客户端,应该具备以下功能:
1、向指定地址的服务器发送连接请求;
2、向已经连接成功的服务器发送信息;
3、主动断开与服务器的连接;
当我们已经知道客户端的功能时就应该想到,我们该怎样用代码实现这些功能呢;当然对于初学者来说编写这些代码还有点困难,我们可以先参考网络上的资料把原理弄懂,这才是我写这篇文章的本意

(1)在“MFC类向导”对话框中输入类名CClientSocket,向导将自动为这个添加的类生成名为“ClientSocket.h”和“ClientSocket.cpp”的头文件和源文件,如图所示。
在这里插入图片描述
(2)单击“完成”按钮,可以在类视图中看到刚刚添加的类CClientSocket(如图2.10所示)。
在这里插入图片描述
(3)客户端程序文件。
打开已经创建好的客户端工程,在解决方案资源管理器中可以看到工程的所有程序文件(如图2.11所示)。
在这里插入图片描述
(4)用头文件和类对象将程序源文件联成有机整体
要使客户端程序能够创建和控制本地的Socket,在客户端工程界面控制模块的头文件ChatClientDlg.h中添加如下两行代码:

#include "ClientSocket.h"  	//使主界面程序能够访问Socket类的代码文件
CClientSocket m_ClientSocket;//为了后面与服务器通信而定义的Socket成员变量

在这里插入图片描述
(5)反过来要使Socket能够访问到主界面上的控件,以便能够将自己的状况随时反映给主程序并在主界面上显示出来,也需要在Socket源文件ClientSocket.cpp中添加头文件声明:

#include "ChatClientDlg.h"

从上面已经标注了所用函数的通信流程图,可以进一步得出下面的源程序代码组织框图(如图所示)。

在这里插入图片描述
(6)选择OnConnect()函数,为其添加代码,系统将该函数的代码自动置于ClientSocket.cpp文件中。OnConnect()函数代码如下:

//确认客户端是否成功连接到服务器
if(nErrorCode)
{
   
		AfxMessageBox("连接失败,请您重试!");
		return;
}
((CChatClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString("连接服务器成功!");
((CChatClientDlg*)(AfxGetApp()->m_pMainWnd))->m_ListWords
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值