VC++第9章网络编程

上传人:慢*** 文档编号:237686367 上传时间:2022-01-10 格式:PPT 页数:34 大小:350.50KB
返回 下载 相关 举报
VC++第9章网络编程_第1页
第1页 / 共34页
VC++第9章网络编程_第2页
第2页 / 共34页
VC++第9章网络编程_第3页
第3页 / 共34页
VC++第9章网络编程_第4页
第4页 / 共34页
VC++第9章网络编程_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《VC++第9章网络编程》由会员分享,可在线阅读,更多相关《VC++第9章网络编程(34页珍藏版)》请在金锄头文库上搜索。

1、教学目标 第9章 网络编程 了解CSocket程序设计基础 (1)计算机名、IP地址和端口(2)WinSock的工作原理(3)有连接的通信模式 掌握基于CSocket类的网络编程技术 利用Csocket开发C/S模式的聊天室 Visual C+程序设计电子教案-王明福编 聊天室程序演示 CSocket程序设计基础 基于Csocket的网络编程 聊天室客户端应用程序的开发 聊天室服务器端应用程序 扩充练习 教学内容返 回服务器端程序 (演示程序)客户端程序(演示程序) 9.1 公众聊天室程序返 回计算机名、IP地址和端口WinSock的工作原理服务器端的编程步骤客户端编程步骤 9.2 CSock

2、et程序设计基础返回目录要点提示: 计算机名、IP地址和端口 1IP地址 IP地址是一个32位的数字,用于唯一标识位于网络中的计算机。IP地址由两部分组成:网络标识和主机标识。IP地址的格式有两类:二进制和十进制格式。32位二进制的IP地址以8为单位进行分隔,换算成十进制,每个十进制数之间用“.”隔开。 例如: 10100010,1110010,1011111,10000001转化为十进制的IP地址是: 162.114.95.129 为了便于对IP地址进行管理,将IP地址分为5类,如图9-3所示。 2计算机名 避免输入计算机的IP地址带来的麻烦,我们可以通过计算机名来代替IP地址。 计算机名、

3、IP地址和端口(续)返回目录3端口 在利用计算机网络进行通讯时,除利用IP地址找到指定的计算机外,还要通过端口(Port)来标识进行通讯的进程,TCP/UDP协议为每个端口都分配一个端口号,当进程通过系统调用,同一个或多个端口建立联系后,就可已通过这些端口进行数据传输了。 TCP/IP端口号有16位,因此可以有216个端口。在这216个端口中,有一些是保留端口,由权威机构分配,用于特殊目的。例如,端口80被用作超文本协议和WWW服务。保留端口外的端口为自由端口,以本地方式进行分配。 利用WinSock进行有连接的通信 返回目录 使用TCP传输协议,可以与指定IP地址的主机建立连接,采用流的方式

4、进行数据传输,优点是保证网络数据传输的可靠性,对没有到达的数据进行重传,通过效验确定数据是否正确。工作方式如图9-4所示。 利用WinSock进行无连接的通信 返回目录 使用UDP数据报传输协议,可以与指定IP地址的主机发送数据,也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位,没有主次之分如图9-5所示。 9.3基于CSocket的网络编程v从CSocket类派生一个新类v创建一个CSocket派生类对象v调用CSocket:Create()创建一个套接口,并指定端口v调用CSocket:Listen()函数侦听端口v在CSocket派生类中添加虚函数OnAccept() 调用

5、CSocket:Accept()接受客户的连接请求vCSocket派生类中添加虚函数OnReceive() 调用CSocket:Receive()接受数据v调用Close()函数关闭为各个客户分配的读套接口。服务器端的编程步骤:返回目录 基于CSocket的网络编程(续)v创建CSocket类的派生类对象,用于连接和读写v调用CSocket:Create( ) 创建一个套接口v调用CSocket:Connect( )连接服务器的指定端口v调用CSocket:Send( ) 发送数据v在CSocket:OnReceive( )函数中进行读写操作v结束通讯时,调用CSocket:Close( )

6、关闭套接口客户端的编程步骤:返回目录 9.4.1 创建工程MyWc(设置“Windows Sockets”支持) 9.4.2 可视化设计用户界面(参考表9.2) 9.4.3 创建一个新类CWCSock,用于与服务器通信 9.4.4 接受服务器发来的数据 9.4.6 建立与服务器的连接 9.4.6 向服务器发送数据 9.4.7 建立CMyWcDlg类与CWCSock类的关联 9.4.8 处理自定义消息 9.4.9 处理控件的状态 9.4 聊天室客户端应用程序 要点提示:返回目录 创建与服务器的通信类CWSock1. 选择“Insert”菜单的“New Class”菜单项,在New Class对话

7、框中,Bass class列表框中选取CSocket作为基类2. 单击“OK”按钮,VC+就为MyWc工程创建了一个新类CWCSocket,相应地为工程创建了两个文件WCSocket.h和WCSocket.cpp返回目录 建立与服务器的连接void CMyWcDlg:OnConnect() UpdateData(true); /更新关联变量,如服务器名、端口号 if(!sockClient.Create() /1创建套接口 AfxMessageBox(Create WC socket failed); PostQuitMessage(0); if(!sockClient.Connect(m_s

8、erver_name,m_nPort)/2连接服务器 MessageBox(连接失败!); return; m_Dat.m_bOnline=true;/标记连接成功返回目录 向服务器发送数据voidCMyWcDlg:OnSend()UpdateData(true);/更新关联变量,如要发送的信息m_Dat.m_bOnline=true;memset(m_Dat.m_dbData,0,255);memcpy(m_Dat.m_dbData,m_send_info,m_send_info.GetLength();strcpy(m_Dat.m_strName,m_client_name);intiSe

9、nt=sockClient.Send(&m_Dat,sizeof(m_Dat);/发送的信息/如果发送成功,将其发送的信息添加并显示在列表编辑框if(iSent!=SOCKET_ERROR)m_ctlSent.AddString(m_send_info);UpdateData(false);/显示更新返回目录 接受服务器发来的数据1. 添加虚拟函数 用MFC ClassWizard在CWCSock类中添加虚函数OnReceive()2. 读取服务器传来的数据,通知主窗口进行处理void CWCSock:OnReceive(int nErrorCode) if(Receive(&m_Dat,si

10、zeof(m_Dat)=sizeof(m_Dat) :PostMessage(:AfxGetApp()-m_pMainWnd-m_hWnd,RE_RECEIVED, (WPARAM)&m_Dat,0);CSocket:OnReceive(nErrorCode);返回目录 建立CMyWcDlg类与CWCSock类的关联1. 在CMyWcDlg类中添加CWCSock类的对象,使它们相互关联。方法是在MyWcDlg.h文件中,在CMyWcDlg类定义前面添加如下语句: #include WCSock.h2. 在CMyWcDlg类定义中添加如下语句: CWCSock sockClient; 返回目录

11、处理自定义消息1.在WCSock.h中,定义自定义消息,以使CWCSock能够同应用程序主窗口通信。#defineRE_RECEIVEDWM_USER+12在CMyWcDlg.cpp文件中,添加消息映射宏,响应CWCSock类对象发送过来的自定义消息RE_RECEIVEDBEGIN_MESSAGE_MAP(CMyWcDlg,CDialog)/AFX_MSG_MAP(CMyWcDlg)ON_BN_CLICKED(IDC_SEND,OnSend)ON_MESSAGE(RE_RECEIVED,OnReceive);/AFX_MSG_MAPEND_MESSAGE_MAP()返回目录 处理自定义消息(续

12、一)3在CMyWcDlg类添加自定义函数OnMyReceiveclass CMyWcDlg : public CDialogpublic:CMyWcDlg(CWnd* pParent = NULL);CWCSock sockClient; /自定义函数说明LRESULT OnMyReceive(WPARAM wparam,LPARAM lParam);返回目录 处理自定义消息(续二)4. 4. 在在CMyWcDlgCMyWcDlg类的实现文件中添加函数体类的实现文件中添加函数体LRESULT LRESULT CMyWcDlgCMyWcDlg:OnMyReceiveOnMyReceive(WPA

13、RAM (WPARAM wparamwparam,LPARAM ,LPARAM lParamlParam) ) _DATA * _DATA *datdat; ; datdat = new _DATA; = new _DATA; memcpymemcpy( (datdat,(_DATA *),(_DATA *)wparamwparam, ,sizeofsizeof(_DATA);(_DATA); CString str CString str = = datdat-m_-m_strNamestrName; ; strstr += : ; += : ; strstr += += datdat-m_

14、-m_dbDatadbData; ;m_m_ctlRecvdctlRecvd. .AddStringAddString( (strstr);/);/将信息添加并显示在列表框中将信息添加并显示在列表框中UpdateDataUpdateData(false); /(false); /显示列表编辑框内容显示列表编辑框内容delete delete datdat; ; return 1; return 1; 返回目录 处理控件的状态1. 在OnClose()和OnInitDialog()函数中 GetDlgItem(IDC_CONNECT)-EnableWindow(true); GetDlgItem

15、(IDC_SEND)-EnableWindow(false); GetDlgItem(IDC_CLOSE)-EnableWindow(false); GetDlgItem(IDC_SERVER_PORT)-EnableWindow(true); GetDlgItem(IDC_CLIENT_NAME)-EnableWindow(true); GetDlgItem(IDC_SERVER_NAME)-EnableWindow(true);返回目录 处理控件的状态(续)2. 在OnConnect()函数中 GetDlgItem(IDC_CONNECT)-EnableWindow(false); Get

16、DlgItem(IDC_SEND)-EnableWindow(true); GetDlgItem(IDC_CLOSE)-EnableWindow(true); GetDlgItem(IDC_SERVER_PORT)-EnableWindow(false); GetDlgItem(IDC_CLIENT_NAME)-EnableWindow(false); GetDlgItem(IDC_SERVER_NAME)-EnableWindow(false);返回目录9.5.1 创建工程9.5.2 设计用户界面9.5.3 创建侦听类CLSock9.5.4 增加读/写类CRWSock9.5.8 处理接受客户的信息9.5.9 处理客户的连接请求9.5.10 启动、关闭服务器9.5.11 控件的状态更新 9.5 聊天室服务器端应用程序 返回目录要点提示: 服务器端的界面设计返回目录对 象属 性设 置ButtonIDCaptionIDC_START启 动ButtonIDCaptionIDC_CLOSE关 闭Edit BoxIDIDC_SERVER_PORTList BoxIDSelectionVertic

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号