互联网网络通信的基础是TCP/IP,即传输控制协议和网络互联协议。按照TCP/IP规定,32位IP地址用4个字节来表示,例如,“192.168.1.100”。图15-1 通过命令查看本机网络配置在“本地连接”的属性设置对话框中,双击“Internet协议”,如图15-2所示。图15-2 查看网络邻居属性图15-3 TCP/IP属性设置在TCP/IP中计算机软件通信必须依赖于通信端口,端口号的范围是0~65535。......
2023-11-25
TCP的通信过程比UDP复杂得多,必须依据C/S架构基础进行开发,一般TCP通信软件都分为服务器端和客户端两部分。.TCP服务器端由一个侦听Socket和多个用于应答的Socket组成,每个应答Socket与客户端建立一对一的数据流通道。客户端程序只包含一个连接Socket,它在成功连接服务器后与某一个应答Socket进行一对一的数据通信。
服务器的侦听Socket就如同公司的前台接待员,不参与客户的订单买卖。当有上门联系的客户时引荐给客户经理,每一个应答Socket就代表一个客户经理。具体的数据交互过程,必须由应答Socket与客户端之间一对一地进行,如图15-12所示。
图15-12 TCP服务器的侦听和应答结构
创建工程名为“Server”和“Client”的两个对话框程序,用于演示通过CSocket类实现简单的TCP数据通信。在创建应用程序向导的第2页,选中“Windows Sockets”复选框。该选项在创建工程时自动向stdafx.h预编译头文件中增加afxsock.h头文件,并在App类的InitInstance进程启动函数中调用AfxSocketInit函数,如图15-13所示。
图15-13 MFC应用程序向导
1)创建工程完毕后查看stdafx.h预编译头文件,如图15-14所示。
2)再查看InitInstance函数。
图15-14 程序向导自动添加的代码
3)在Server工程中创建一个CSocket类的派生类CListenSocket,如图15-15所示。
图15-15 添加新类
4)用同样的方法再创建一个CScoket类的派生类CClientSocket,如图15-16所示。
图15-16 创建后的CSocket派生类
5)在CServerApp类的头文件中,添加一个指针链表类型的成员变量。
6)在CListenSocket类中添加虚函数OnAccept,用于截获客户端的连接。
7)在CClientSocket类中添加虚函数OnReceive,用于截获客户端发来的网络数据。
8)在CClientSocket类中添加虚函数OnClose,用于监测某个客户端是否断开了连接。
(www.chuimin.cn)
9)在主对话框类中,添加CListenSocket类型的成员变量。
10)修改主对话框初始化函数代码,创建Socket并开始侦听。
11)在Client工程的主对话框中增加一些控件,如图15-17所示。
图15-17 编辑主对话框资源
12)修改控件属性,见表15-4。
表15-4 主对话框的控件属性
13)创建一个CSocket的派生类CConnectSocket,如图15-18所示。
图15-18 创建后的CSocket派生类
14)在CConnectSocket类中添加虚函数OnReceive,用于截获服务器发来的网络数据。
15)在主对话框类的头文件中,添加一个CConnectSocket类型的成员变量。
16)修改主对话框初始化函数的代码。
17)在主对话框类中,添加“发送(&S)”按钮的消息映射函数OnOK。
18)编译并运行,测试服务器和客户端代码,如图15-19所示。
首先开启服务器程序,再在一台或多台计算机开启多个客户端程序进行测试,很明显这是一个简易的聊天室软件框架。
图15-19 查看运行结果
有关VC++就业培训宝典之MFC视频教程的文章
互联网网络通信的基础是TCP/IP,即传输控制协议和网络互联协议。按照TCP/IP规定,32位IP地址用4个字节来表示,例如,“192.168.1.100”。图15-1 通过命令查看本机网络配置在“本地连接”的属性设置对话框中,双击“Internet协议”,如图15-2所示。图15-2 查看网络邻居属性图15-3 TCP/IP属性设置在TCP/IP中计算机软件通信必须依赖于通信端口,端口号的范围是0~65535。......
2023-11-25
Socket的中文称为“套接字”,是专门用于开发通信程序的句柄。在软件通信过程中,Socket管理端口的创建、侦听、连接和数据收发等功能。创建一个工程名为“u”的对话框程序,用于演示创建UDP端口并进行简单的数据通信。表15-3 主对话框的控件属性3)新建一个CSocket派生类CSocku,用于截获接收到的网络通信数据,如图15-5所示。16)再次修改CSocku类中的OnReceive函数,将收到的数据和对方IP添加到历史编辑框内。......
2023-11-25
当框架类窗口大小变化时,客户区内所有子窗口的位置自动排布。CFrameWnd类对工具栏的停靠和浮动控制,在其他CWnd派生类中都难以实现。图12-35 CFrameWnd类①调用CFrame::Create函数直接创建。LoadFrame对参数进行裁剪,只有第一个参数必须代入,其余参数具有默认数值。LoadFrame不需要代入窗口类型名,也就无需在创建前先注册。CDocTemplate对象将框架、视图与文档绑定在一起,三个组成部分统一由系统内部创建。表12-5 CFrameWnd类的常用成员(续)2)CMDIFrameWnd类如图12-36所示。......
2023-11-25
CBrush类的主要成员见表7-4。表7-4 CBrush类的主要成员1)用于填充的阴影线风格主要包括以下几种。创建一个工程名为“Brush”的对话框程序,用于演示选用不同画刷进行绘画的效果。2)在资源视图中,单击鼠标右键,在弹出的快捷菜单中,选择“Import”命令导入位图,如图7-16所示。图7-19 查看运行结果CBrush类构造函数与CreateSolidBrush和CreateHatchBrush等函数的功能基本一样,都可以用于创建一个画刷。一般当使用新画刷绘画结束后,最好恢复选择回旧画刷。......
2023-11-25
打开本章第7节建立的“Tp”工程,继续演示CWinApp类的开发应用。1)修改启动函数CWinApp派生类的构造函数代码。m_pszAppName成员变量有三种途径赋值,首先在CWinApp构造函数中获得字符串。在App派生类以外,调用CWinApp类成员函数的方法有两种。CWinApp类的成员函数LoadIcon和LoadStandardIcon,实际上是封装了API函数LoadIcon的结果。和加载图标的两个函数一样,CWinApp类的成员函数LoadCursor和LoadStandardCursor,分别用于加载程序光标和系统光标资源,它们封装的也是同一个API函数LoadCursor。......
2023-11-25
创建一个工程名为“Mdc”的对话框程序,演示CMemDC类的封装及调用过程。2)选中“C/C++Header File”项,输入“MemDC”后单击“OK”按钮,如图8-2所示。图8-3 编辑主对话框资源5)在主对话框类的头文件中,修改代码,增加两个CMemDC类对象。图8-4 添加WM_SIZE消息映射函数7)修改消息映射函数代码,当窗口大小变化时在内存DC中缩放背景图。图8-5 查看运行结果本示例重点演示了CMemDC类的封装过程,以及加载文件位图和创建内存DC的方法。......
2023-11-25
表11-2 主对话框的控件属性(续)3)在主对话框的头文件中,添加一个CToolTipCtrl类型成员变量。4)修改主对话框的初始化函数,调用CToolTipCtrl::Create函数创建提示窗口。5)在ClassView中添加一个虚函数PreTranslateMessage。7)在类向导中,为列表控件和组合控件添加关联变量,如图11-25所示。9)在主对话框类中,添加两个普通成员函数。图11-26 查看运行结果14)如果要让提示文字多行显示,则只要再添加一行代码。......
2023-11-25
一般画面都是矩形,选用了CRgn修饰的画面输出之后,画面就被剪切成不规则的形状。CRgn类的主要成员见表7-7。表7-7 CRgn类的主要成员创建一个工程名为“Rgn”的对话框程序,用于演示选择区域后的画面输出效果。图7-23 查看运行结果3)在OnPaint函数的末尾添加两行代码,将两个不规则区域合并后设置窗口的形状。rg1.CombineRgn;SetWindowRgn;4)为了让窗口形状和画面一致,修改主对话框的边框为“None”,如图7-24所示。图7-25 添加WM_NCHITTEST消息映射函数6)修改消息映射函数代码。......
2023-11-25
相关推荐