利用MFC进行网络编程剖析
mfc编程用途

mfc编程用途
MFC(Microsoft Foundation Classes)是微软公司提供的一个用于 Windows 应用程序开发的类库和框架。
它将 Windows API 进行了封装,提供了一系列的类和函数,使得开发者可以更加方便地创建 Windows 应用程序。
以下是 MFC 编程的一些常见用途:
1. 用户界面开发:MFC 提供了丰富的 UI 组件和控件,如按钮、文本框、列表框等,开发者可以利用这些组件快速构建出美观的用户界面。
2. 图形和绘图:MFC 提供了绘图和图形操作的类和函数,开发者可以使用这些功能来绘制图形、显示图像以及实现动画效果。
3. 文件和数据库操作:MFC 提供了文件操作和数据库访问的类和函数,开发者可以使用这些功能来读取、写入文件,以及连接和操作数据库。
4. 网络编程:MFC 提供了网络通信相关的类和函数,开发者可以使用这些功能来创建网络应用程序,实现客户端/服务器通信。
5. 多线程编程:MFC 支持多线程编程,开发者可以使用它来创建并发执行的线程,提高程序的性能和响应能力。
6. 串口通信:MFC 提供了串口通信的类和函数,开发者可以使用这些功能来与外部设备进行串口通信。
7. 打印和打印预览:MFC 提供了打印和打印预览的功能,开发者可以利用这些功能来设计和实现打印相关的应用程序。
8. 动态链接库(DLL)开发:MFC 可以用于创建动态链接库,这些库可以被其他应用程序调用,实现代码的重用和模块化。
总之,MFC 编程提供了一个强大的工具集,使得开发者能够更加高效地创建 Windows 应用程序,并且减少了对底层 Windows API 的直接操作,提高了开发效率和代码的可维护性。
MFC实现简单网络聊天程序

MFC实现简单网络聊天程序MFC(Microsoft Foundation Classes)是微软公司提供的一个应用程序框架,用于开发Windows系统上的图形用户界面程序。
在此基础上,我们可以利用MFC来实现简单的网络聊天程序。
首先,我们需要创建一个MFC应用程序项目。
使用Visual Studio打开,选择MFC应用程序向导,选择对话框风格。
然后,设置对话框的布局,包括聊天消息显示框、消息输入框、发送按钮等控件。
接下来,我们需要使用Socket编程来实现网络通信功能。
MFC提供了CSocket类,我们可以使用它来处理数据的发送和接收。
在对话框类中添加成员变量m_socket,类型为CSocket。
在OnInitDialog函数中,我们需要创建Socket,并进行连接。
可以通过使用Create函数创建CSocket对象,并调用Connect函数来连接指定的地址和端口号。
例如,可以连接到本地主机上的一些端口,这样就可以进行本地测试。
然后,我们需要添加事件处理函数来处理发送和接收消息。
当发送按钮被点击时,可以通过调用Socket对象的Send函数将消息发送给服务器。
可以使用CString类来处理字符串数据。
当接收到消息时,可以通过调用Socket对象的Receive函数将消息接收到的缓冲区中。
为了提供实时地聊天消息显示功能,我们需要使用SetWindowText函数将数据显示到聊天消息显示框中。
当接收到消息时,可以将消息显示在聊天消息显示框中,同时可以使用UpdateData函数实时更新界面。
在程序结束时,我们需要断开连接并销毁Socket对象。
在析构函数中,可以调用Shutdown函数来关闭连接,然后销毁Socket对象。
除了基本的发送和接收消息功能,我们还可以添加一些其他的功能,比如可以使用菜单栏来选择连接和断开服务器,可以添加登录和注册功能等。
这些可以根据实际需求进行扩展。
总结起来,通过使用MFC应用程序框架和Socket编程,我们可以实现简单的网络聊天程序。
C++课件:MFC编程基础

2021/7/10
12
MFC的优点
1、MFC对于类、类的继承、封 装、多态性、类间关系和相互作 用等应用程序特性都有具体体现, 可以使开发者高效、轻松地建立 Windows应用程序,而不受设 备限制并且由事件进行驱动。
2021/7/10
13
2、MFC具有良好的通用性和 可移植性,它定义了应用程序 的轮廓,并提供了用户接口的 标准实现方法,程序员所要做 的工作就是通过VC所提供的各 种工具来完成这个工作。
(1)CStatic(2)CButton(3)CEdit
(4)CScrollBar(5)CSliderCtrl
(6)CListBox (7)CComboBoxl
(8)CBitmapButton (9)CAnimateCtrl
(10) CTreeCtrl(11)CListCtrl
2021/7/10
27
程序员可以使用这一框架创建
Windows应用程序。
同时:MFC的组织是以C++类层次形式组
织
起来的,几个高层类提供一般功能,
而低层类实现更具体的功能,每一个低
层类都是从高层类派生而来,因此继承
了2021高/7/1层0 类的功能。
2
所以:MFC是一种类的层次结构, 它提供了一个应用程序开发框架, 此框架称为文档/视图架构。
1、Windows消息函数 2、文件处理函数 3、网络函数 4、菜单函数 5、文本与字体函数 6、硬件与系统函数 7、控件和消息函数 8、位图、图标和光栅运算函数 9、绘图函数 10、打印函数 11、设备场景函数 12、进程和线程函数
2021/7/10
6
程序员如何去学习MFC
1、C++语言基础 2、Windows操作系统基础 3、面向对象程序观念的基础
MFC串口通信编程详解解析

串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,
}
return TRUE;
二配置串口
在打开通讯设备句柄后,常需要对串口进行一些初始化配置工作.这需要通过一个DCB结构来进行.DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息.在查询或配置串口的属性时,都要用DCB结构来作为缓冲区.
一般用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置.要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口.
//EVENPARITY偶校验NOPARITY无校验
//MARKPARITY标记校验ODDPARITY奇校验
BYTE StopBits;//指定停止位的位数.此成员可以有下列值:
//ONESTOPBIT 1位停止位TWOSTOPBITS 2位停止位
//ONE5STOPBITS 1.5位停止位
………
} DCB;
0,//同步方式
NULL;
if(hCom==(HANDLE-1
{
MessageBox("打开COM失败!";
return FALSE;
}
return TRUE;
重叠I/O打开串口的示例:
HANDLE hCom;//全局变量,串口句柄
hCom =CreateFile("COM1",//串口名称
基于MFC的应用程序框架分析幻灯片PPT

2、视图类
视图类是由CView类派生的,它负责显示文档 类的数据,可以显示在屏幕上,也可以输出 在打印机和其他设备上。在屏幕上,这个类 管理客户窗口。 例:在实现一个图形系统时,屏幕上显示、 打印机绘图的工作都是由视图类完成的。
基于MFC的应用程序框架分析幻 灯片PPT
本PPT课件仅供大家学习使用 请学习完及时删除处理 谢谢!
一、什么是MFC?
1、概述 微软基础类库(MFC:Microsoft Foundation Class)
是微软为Windows程序员提供的一个面向对象的 Windows编程接口,它大大简化了Windows编程工作。 使用MFC类库的好处是:首先,MFC提供了一个标准化 的结构,这样开发人员不必从头设计创建和管理一个 标准Windows应用程序所需的程序,而是“站在巨人 肩膀上”,从一个比较高的起点编程,故节省了大量 的时间;其次,它提供了大量的代码,指导用户编程 时实现某些技术和功能。 2、MFC类库的概念及组成 (1) 类库是一个可以在应用中使用的相互关联的C++类 的集合。
化.如果失败,则调用应用类的ExitInstance ()函数,转至5)。 4)调用应用类的Run()函数,其功能主要是 进行消息循环,
不断获取消息和处理消息。一直到用户关闭应用程序的窗口, 产生WM_QUIT消息,调用ExitInstance ()函数,准备退出。
5)进行应用程序的收尾工作,比如删除注册 的窗口类等。 6)返回。
CDrawView* pView=(CDrawView *)GetActiveView( ); 3、获得应用类对象的指针 例:CDrawApp* pWinApp=(CDrawApp*)AfxGetApp(); 4、从应用类对象中获得主框架类对象的指针
使用MFC进行可视化编程

使用MFC进行可视化编程
MFC(Microsoft Foundation Classes,微软基础类)是一个C++图形用户界面(GUI)应用程序编程框架,它主要用于开发Windows应用程序。
MFC是微软的一个可视化编程框架,由C++构成,以C++为基础实现可视化编程。
MFC的主要功能是抽象出Windows平台的GUI底层,减少编程者使用Windows API的繁琐程度,使应用程序的开发更加容易。
MFC提供了许多可视化的功能来帮助开发者开发Windows应用程序,它主要由以下几个部分组成:
(1)基础框架:MFC建立在Windows API基础上,它封装了许多Windows系统函数,使得使用者不需要编写复杂的Windows基础函数就可以实现可视化的界面。
(2)界面控件:MFC提供了大量的界面控件,可以让开发者快速实现可视化编程,如按钮、对话框、工具栏、菜单栏等,而且还提供了自定义控件的功能,可以让开发者自定义控件来满足特定业务的需求。
(3)图像处理:MFC提供大量的图像处理的API函数,可以实现图像的显示、缩放、旋转、裁剪等功能,而且支持大量的图像格式,可以满足大多数应用的需求。
(4)网络访问:MFC提供了网络访问的接口,可以实现基于HTTP协议的网络访问,实现网络编程,而且支持多种数据格式,可以轻松实现网络应用的开发。
VC++WinInet类实现Internet编程

一、MFC WinInet类1、简介WinInet的全称是Microsoft Win32 Internet Functions,是微软公司提供给用户进行Internet编程的API接口函数。
WinInet函数包含在系统动态链接库WinInet.dll中,微软公司通过对WinInet API接口函数进行封装形成了WinInet类。
WinInet类使得程序可以在较高的上编写Internet客户端应用程序,而不用关心网络协议和Winsock套接字的具体细节。
WinInet类不是一个类,而是一批类的集合,MFC对这些类进行了封装。
二、超文本传输协议1、概述超文本传输协议(Hypertext Transfer Protocol,HTTP)是万维网(World Wide Web,WWW,简称Web)的基础。
HTTP协议是基于TCP/IP协议之上的应用层协议,它是WWW应用的主流协议。
基于HTTP协议开发的应用程序主要是客户端/服务器端(b/s)模式,以一种请求/应答的方式进行通信。
在客户端与服务器端建立连接后,客户端可以向服务器端发送请求服务,HTTP请求的格式为URI+HTTP版本号+有效数据,其中URI(Uniform Resource Identifier)为统一资源标识符,请求的方法常用的有GET、HEAD、POST这三种,这三种请求方法的功能如下表所示:服务器端在收到客户端的请求后,给予客户端相应的应答信息,应答格式为HTTP版本号+应答码+有效数据。
HTTP协议的通信端口默认是80,基于HTTP协议的客户端/服务器端通信流程主要包括建立连接、发送请求信息、发送应答信息和关闭连接。
说明:通过应用Winsock可以完成上面基于HTTP协议的通信,实现过程会复杂一点。
2、用MFC WinInet类建立访问Internet服务器端的客户端应用程序用MFC WinInet类建立访问Internet服务器端的客户端应用程序的步骤如下:(1)、建立会话。
MFC下CSocket编程详解

MFC下CSocket编程详解:1. 常用的函数和注意事项(详细的函数接口说明请查看MSDN):CSocket::Create 初始化(一般写服务器程序都不要用为好,用下面的CSocket::Socket 初始化)CSocket::Socket初始化CSocket::SetSockOpt 设置socket选项CSocket::Bind 绑定地址端口CSocket::Connect 连接CSocket::Listen 监听CSocket::Accept 接收外部连接的socketCSocket::Send 发送内容CSocket::Receive 接收内容CSocket::Close 关闭(不等于delete)1) 在使用MFC编写socket程序时,必须要包含<afxsock.h>头文件。
2) AfxSocketInit() 这个函数,在使用CSocket前一定要先调用该函数,否则使用CSocket会出错;并且该函数还有一个重要的使用方式,就是在某个线程下使用CSocket 前一定要调用,就算主线程调用了该函数,在子线程下使用CSocket 也要先调用该函数,要不会出错。
3) 还要注意的是, Create 方法已经包含了Bind 方法,如果是以Create 方法初始化的前提下不能再调用Bind ,要不一定出错。
2. 以下是使用例子代码,通过例子来学习如何使用CSocket 进行编程,1) 客户端主要代码://初始化AfxSocketInit();//创建CSocket 对象CSocket aSocket;CString strIP;CString strPort;CString strText;this->GetDlgItem(IDC_EDIT_IP)->GetWindowText(strIP);this->GetDlgItem(IDC_EDIT_PORT)->GetWindowText(strPort);this->GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(strText);//初始化CSocket 对象, 因为客户端不需要绑定任何端口和地址, 所以用默认参数即可if(!aSocket.Create())...{char szMsg[1024] = ...{0};sprintf(szMsg, "create faild: %d", aSocket.GetLastError());AfxMessageBox(szMsg);return;}//转换需要连接的端口内容类型int nPort = atoi(strPort);//连接指定的地址和端口if(aSocket.Connect(strIP, nPort))...{char szRecValue[1024] = ...{0};//发送内容给服务器aSocket.Send(strText, strText.GetLength());//接收服务器发送回来的内容(该方法会阻塞, 在此等待有内容接收到才继续向下执行)aSocket.Receive((void *)szRecValue, 1024);AfxMessageBox(szRecValue);}else...{char szMsg[1024] = ...{0};sprintf(szMsg, "create faild: %d", aSocket.GetLastError());AfxMessageBox(szMsg);}//关闭aSocket.Close();2)服务器端代码:unsigned int StartServer(LPVOID lParam)...{//初始化Winscokif (!AfxSocketInit())...{AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return 1;}m_exit = false;CServerDlg *aDlg = (CServerDlg *)lParam;CString strPort;aDlg->GetDlgItemText(IDC_EDIT_PORT, strPort);UINT nPort = atoi(strPort);//socket------------------------------------------------CSocket aSocket, serverSocket;//最好不要使用aSocket.Create创建,因为容易会出现10048错误if (!aSocket.Socket())...{char szError[256] = ...{0};sprintf(szError, "Create Faild: %d", GetLastError());AfxMessageBox(szError);return 1;}BOOL bOptVal = TRUE;int bOptLen = sizeof(BOOL);//设置Socket的选项, 解决10048错误必须的步骤aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET); //监听if(!aSocket.Listen(10))...{char szError[256] = ...{0};sprintf(szError, "Listen Faild: %d", GetLastError());AfxMessageBox(szError);return 1;}CString strText;aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);strText += "Server Start! ";aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);while(!m_exit)...{//接收外部连接if(!aSocket.Accept(serverSocket))...{continue;}else...{char szRecvMsg[256] = ...{0};char szOutMsg[256] = ...{0};//接收客户端内容:阻塞serverSocket.Receive(szRecvMsg, 256);sprintf(szOutMsg, "Receive Msg: %s ", szRecvMsg);aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);strText += szOutMsg;aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);//发送内容给客户端serverSocket.Send("Have Receive The Msg", 50);//关闭serverSocket.Close();}}//关闭aSocket.Close();serverSocket.Close();aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);strText += "Have Close!";aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);return 0;}//绑定端口if (!aSocket.Bind(nPort))...{char szError[256] = ...{0};sprintf(szError, "Bind Faild: %d", GetLastError());AfxMessageBox(szError);return 1;}3) SDK 下的服务器端代码//子线程函数unsigned int StartServer(LPVOID lParam)...{//初始化Winsock, AfxSocketInit() 也是封装了这些语句, 不过AfxSocketInit() 所做的事比这里多些WSADATA wsaData;//Winsock 的版本, 建议用1.1 ,兼容性好WORD wVersionRequested = MAKEWORD(1, 1);int nResult = WSAStartup(wVersionRequested, &wsaData);if (nResult != 0)...{return 1;}//-----------------------------------------------------m_exit = false;CServerDlg *aDlg = (CServerDlg *)lParam;CString strPort;aDlg->GetDlgItemText(IDC_EDIT_PORT, strPort);UINT nPort = atoi(strPort);//socket------------------------------------------------//接口对象SOCKET aSocket, serverSocket;//寻址相关结构sockaddr_in serverSockaddr;memset(&serverSockaddr, 0, sizeof(serverSockaddr));aSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (aSocket == INV ALID_SOCKET)...{char szError[256] = ...{0};sprintf(szError, "Create Faild: %d", GetLastError());AfxMessageBox(szError);return 1;}//注意,该处非常重要,取值的正确与否决定关闭scoket后端口是否能正常释放BOOL bOptVal = TRUE;int bOptLen = sizeof(BOOL);//设置socket 选项, SOL_SOCKET 和SO_REUSEADDR 一起使用, 并且后面的参数如上,关闭scoket后端口便能正常释放setsockopt(aSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&bOptVal, bOptLen);//寻址相关结构sockaddr_in aSockaddr;memset(&aSockaddr,0,sizeof(aSockaddr));aSockaddr.sin_family = AF_INET;aSockaddr.sin_addr.s_addr = htonl(INADDR_ANY);aSockaddr.sin_port = htons((u_short)nPort);//绑定: 注意参数的类型转换if(bind(aSocket,(sockaddr *)&aSockaddr, sizeof(aSockaddr)) == SOCKET_ERROR)...{char szError[256] = ...{0};sprintf(szError, "Bind Faild: %d", GetLastError());AfxMessageBox(szError);return 1;}//监听if(listen(aSocket, 10) == SOCKET_ERROR)...{char szError[256] = ...{0};sprintf(szError, "Listen Faild: %d", GetLastError());AfxMessageBox(szError);return 1;}CString strText;aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);strText += "Server Start! ";aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);while(!m_exit)...{//接收外部连接, 非阻塞serverSocket = accept(aSocket, (sockaddr *)&serverSockaddr, 0);if(serverSocket == INV ALID_SOCKET)...{continue;}elsechar szRecvMsg[256] = ...{0};char szOutMsg[256] = ...{0};//接收客户端内容: 阻塞recv(serverSocket, szRecvMsg, 256, 0);sprintf(szOutMsg, "Receive Msg: %s ", szRecvMsg);aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);strText += szOutMsg;aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);//发送内容给客户端send(serverSocket, "Have Receive The Msg", 50, 0);//关闭closesocket(serverSocket);}}//关闭closesocket(aSocket);closesocket(serverSocket);aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);strText += "Have Close!";aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);//当你使用完Winsock接口后,要调用下面的函数对其占用的资源进行释放WSACleanup();return 0;}3. 总结1) MFC进行编程的确比较简单, 用的代码比较少, 又容易管理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
■ 采用两步构造法:
1、定义CAsyncSocket类对象变量 CAsyncSocket sock;
2、调用Create成员函数进一步创建该对象 sock.Create();
CAsyncSocket类
套接字的种类
■ 流套接字(stream
socket)
• SendTo 和 ReceiveFromCAsynຫໍສະໝຸດ Socket类套接字的工作模式
■ 套接字在使用时分为两种模式
– 阻塞式 – 非阻塞式
■ 阻塞模式也称为同步模式 ■ 非阻塞模式也称为异步模式
CAsyncSocket类
阻塞模式
■ 在阻塞模式下,套接字函数要一直等
到全部操作完成后才返回 ■ 例如,在建立连接时
网卡驱动
主机至网络层
封装的数据包
网络基础知识
使用协议
MFC网络编程
什么是套接字
■ 套接字是一种网络编程接口
– 英文:socket – 字面意思:插座、插口
■ 可以形象地将套接字理解为应用程序与网
络协议之间的插口,也就是编程接口 ■ 套接字在TCP/IP模型中位于传输层之上
– 主要针对TCP、UDP协议进行抽象 – 不涉及应用层协议
– 函数必须等到连接完全建立好为止 – 调用函数的线程在这期间被挂起 – 程序看起来好像停止了响应
CAsyncSocket类
阻塞模式的缺点
■ 以阻塞模式执行套接字函数,可能会
Windows套接字
Windows套接字
■ 套接字的概念最初是由BSD
Unix操作系统
所实现的 ■ Microsoft将Unix套接字中的大部分函数移 植到Windows操作系统,形成了Windows 套接字 ■ Windows套接字针对Windows操作系统的 消息驱动机制,对原有的Unix套接字进行 了扩展,定义了一部分新的函数
利用MFC进行网络编程
Network Programming with MFC
Prof. Xiao-jie Yuan
内容提要
■ 网络基础知识
■ MFC网络编程
– Windows套接字 – CAsyncSocket类
■ TCP协议编程
– 聊天室客户端 – 聊天室服务器端 – 程序功能演示
网络基础知识
Windows套接字
在MFC中使用Windows套接字
■ 使用MFC提供的Windows套接字功能
– 可以利用面向对象的概念进行网络编程 – 比直接调用Win32 API更方便、更直观
■ MFC中与套接字功能有关的类包括:
– CAsyncSocket类: • 对套接字API进行了较低级别的封装
– CSocket类: • 对套接字API进行了较高级别的封装 – CSocket类是CAsyncSocket类的派生类
网络基础知识
TCP/IP模型与OSI模型
OSI 应用层 TCP/IP
表示层
会话层 传输层 网络层 数据链路层
应用层
传输层 互联层 主机至网络层
物理层
网络基础知识
几个典型的协议
■ IP协议(互联层)
– 是一个路由协议,负责IP寻址、数据包的分片 和重组等任务
■ TCP协议(传输层)
– 提供一对一有连接的通信服务 – 提供连接的确认,数据包发送/接收顺序的控制, 出错重传等机制 – 保证数据在传输中的正确性
CAsyncSocket类
CAsyncSocket类
■ CAsyncSocket类只将套接字的通知
消息改进为C++语言中的可重载的消 息处理函数 ■ 没有像CSocket那样引入文件、文档、 串行化等其他额外的概念,这使编程 变得更加简洁方便
CAsyncSocket类
创建CAsyncSocket类对象
Windows套接字
套接字在TCP/IP模型中的位置
应用层
套接字 Sockets
传输层
TCP IP
UDP
IGMP ICMP
互联层
主机至网络层
Windows套接字
ARP 以太网
令牌环 帧中继 ATM
...
套接字是网络通信的端点
■ 在网络中,主机H1上的一个套接字端点
(endpoint)可以和主机H2上的另一个套 接字端点进行通信 ■ IP地址和端口号可以唯一确定一个套接字
– 使用TCP协议进行通信 – 具有TCP协议所拥有的各种特征
• 面向连接的、可靠的数据流传输服务 • 数据包不会出现丢失、重复、乱序等现象
■ 数据报套接字(datagram
socket)
– 使用UDP协议进行通信 – 具有UDP协议所拥有的各种特征
• 面向非连接的、不可靠的用户数据报传输服务 • 数据包可能出现丢失、重复、乱序等现象
Windows套接字
套接字类的层次
CObject
CAsyncSocket
CSocket
Windows套接字
CAsyncSocket类
■ 虽然对Windows
Sockets API的封
装级别较低 ■ 但该类为网络通信程序的开发提供了 很大的灵活性 ■ 可以对一些有关网络协议的具体选项 参数进行设定
CAsyncSocket类
指定套接字的种类
■ Create成员函数缺省创建的是流套接字
SOCK_STREAM
■ 也可以根据需要指明创建数据报套接字
SOCK_DGRAM
■ 流套接字和数据报套接字在收发数据时所
调用的函数有所不同
– 流套接字调用成员函数
• Send 和 Receive
– 数据报套接字调用成员函数
■ HTTP协议(应用层)
– 用于传送Web网页文件
网络基础知识
数据包的封装
TCP/IP模型
用户数据 HTTP首部 用户数据 应用程序
应用层
HTTP协议
TCP首部 HTTP首部 用户数据 IP首部 TCP首部 HTTP首部 用户数据
TCP协议 IP协议
传输层 互联层
以太网首部 IP首部 TCP首部 HTTP首部 用户数据 以太网尾部
TCP/IP协议
■ Windows的网络通信建立在TCP/IP
协议的基础上 ■ TCP/IP协议族包含一系列构成互联网 基础结构的网络协议 ■ TCP/IP字面上代表两个重要协议
– TCP: 传输控制协议 – IP: 网际协议
网络基础知识
TCP/IP参考模型
■ TCP/IP参考模型包括4层:
– 主机至网络层(Host-to-network) – 互联层(Internet) – 传输层(Transport) – 应用层(Application)