


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验十七 Winsock 编程【实验目的】(1) 熟悉 Visual C+ 的基本操作。(2) 基本了解基于对话框的 windows 应用程序的编写过程。(3) 对于 Windows Socket 编程建立初步概念。【实验要求】 应用VisualC+中MFCCSocket类,实现网络数据传输。(2) 制作实用的局域网数据传输程序。【实验原理】一、 Windows Socket 和套接口的基本概念 网际协议 (Intemet Protocol , IP) 是一种用于互联网的网络协议,已广为人知。它可广 泛用于大多数计算机操作系统上,也可用于大多数局域网 LAN(比如办公室小型网络)和广域网WAN
2、比如说互联网)。从它的设计看来,它是一个无连接的协议,并不能保证数据投递万 无一失。两个上层协议(TCP和UDP依赖IP协议进行数据通信。如果希望在Microsoft Windows下通过TCP和 UDP协议建立网络应用程序,则需要使用 Winsock 套接口编程技术。套接口,就是一个指向传输提供者的句柄。 Win32 中,套接口不同于文件描述符,所以 它是一个独立的类型SOCKET Windows Sockets描述定义了一个 Microsoft Windows 的网络编程界面,它是从 Unix Socket 的基础上发展而来的,为 Windows TCPIP 提供了一个 BSD型的套接字规
3、范,除与 4. 3BSD Unix Sockets完全兼容外,还包括一个扩充文件,通 过一组附加的 API 实现 Windows 式(即事件驱动 )的编程风格;而 Winsock 则是在 MicrosoftWi ndows 中进行网络应用程序设计的接口。Win dows在In ternet 支配域中的TCPIP 协议定义了 Winsock 网络编程规范,融入了许多新特点。使用 Socket 的目的是使用户 在网络协议上工作而不必对该网络协议有非常深入的了解。此外, 编写的程序还可被迅速地移植到任何支持 Socket 的网络系统中去。Win sock 提供了二种可为指定传输协议打开、计算和关闭会
4、话的能力。在Win dows下,TCP/ IP上层模型在很大程度上与用户的 Win sock应用有关:换言之,用户的 Wimock应用 控制了会话的方方面面,必要时,还会根据程序的需要格式化数据。套接口有三种类型:流式套接口、数据报套接口及原始套接口。流式套接口定义了一种可靠的面向连接的服务(利用TCP协议),实现了无差错无重复的顺序数据传输。数据报套接口定义了一种无连接的服务(UDP协议),数据通过相互独立的报文进行传输,是无序的,并且不保证可靠和无差错。原始套接口允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。面向连接服务器处理的请求往往比较复杂, 不是一来一去的
5、请求应答所能解决的, 而且 往往是并发服务器。使用面向连接的套接口编程,可以通过图来表示。无连接服务器一般都是面向事务处理的,一个请求、一个应答就完成了客户程序与服务程序之间的相互作用。若使用无连接的套接口编程,程序的流程可以用图表示。套接口工作过程如下: 将该套接口和本地网络地址联系在一起,再调用 定它的请求队列的长度,之后,调用 coni let()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()和write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接口。然后调用bind()liste n()使套接口做好侦听的准备,并规accep
6、t()来接收连接。客户在建立套接口后就可调用在网络编程中,掌握端口的概念十分重要。端口:基于TCP/ IP协议的网络中,计算机都分配有一个IP地址,用一个32位二进制 数来表示,正式的称呼是“Ipv4地址”。客户机需要通过TCP或UDP和服务器通信时,必须指定服务器的IP,地址和服务端口号。另外,服务器打算侦听接入客户机请求时,也必 须指定一个IP,地址和一个端口号。在选择端口时,应特别小心,因为有些可用端口号是 为“已知的”(即固定的)服务保留的,如文件传输协议和超文本传输协议,即FTP(21号端口)和HTTPL般为8080端口)。“已知的协议”,即固定协议,采用的端口由“互联网编 号分配认
7、证(IANA) ”控制和分配,RFC 1700中说明的编号。从本质上说,端口号可分成3类:“已知”端口、已注册端口、动态和(或)私用端口。(1) “已知”端口 0-1023,由IANA控制,是在UNIX中为固定服务保留的。(2)已注册的端口 1024-49151,由IANA列出来的,供普通用户的普通用户进程或程序 使用。(3)动态和(或)私用端口 49152-65535。普通用户应用应选择 1024-49151之间的已注册端口,从而避免端口号已被另一个应用 或系统服务所用。此外,49152-65535间的端口可自由使用,因为IANA这些端口上没有注册服务。二、MFC CSocket类的通信流程
8、使用CSockct类进行网络二进制数据通信的连接流程,如下表所示。服务器端注释客户端Csocket m_server构造一个socket对象Csocket m_client2m_server.create(nport)仓U建 socketM_client.create(nport)听等与服务器m_client.connectstraddr,nport)3m_server.listen()连接建立连接此时阻塞。等待服务器端侦听。Csocket m_receive ;4m_server.accpet(m_receive)构造新的socket对象用以接收此时阻塞,等待客户机连接.客户端的连接5Cso
9、cketFile file(&m_server);构造一文件对象CsocketFile file(&m_server)CArchiveCArchivearin( & file , CArchive : : load)arin(&file , CArchive : : Ioad)6构造流对象CArchiveCArchivearout( & file , CArchive : : store)arout(&file, CArchive : : store)7arin»value ;用流进行数据的传输概念和arin»value ;a
10、rout«value ;cin , cout 相似aroutvvvalue ;注意事项:利用cArchive类进行网络数据传输的操作固然方便直观,但是如果编写的 程序是和别人的程序进行通信的话,就要注意对方的程序是否也用了CArchive类,否则会造成数据相互不能识别。【实验步骤】下面以一个最简单的点对点通信的聊天程序为例:客户机/服务器模式是socket点对点网络程序典型的模式。它用到的方法也是面向连接TCP连接的套接字 MFC典型方式。其工作过程是:服务器首先启动,创建套接字后等待客户 的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务 器可以通过建
11、立的套接字连接进行信息通信。先建立一个 MFC选dialogBased,工程名为 LX2,如图所示。下一个对话框选择Window Sockets,后面的选项酌情考虑,或者连续选择默认的即可,如图所示如果忘了添加 Windows Sockets选项,可以在文件头部添加下列语句进行补救:#include “Winso ck.h ”#in clude“ ws2tcpip.h ”#pragma comment(1ib,” Ws2_32.lib ”)注:这些语句支持 winsock2。出现Dialog以后,编辑界面,使其如图所示并且对控件点击右键,选择属性选项,把 每个控件的ID改掉(控件ID就是每个控
12、件的名字,要改成有意义的,以便将来管理 )。各个控件的ID如下表,并且在对话框视图中点击右键,选择Class Wizard选项,用该工具对控件添加变量。控件ID变量名绑定变量类型对应界面上的控件IDC_CoNTENTm_msgCString输入发送内容的文本框IDC_CONTENTm cuffCEdit输入发送内容的文本框IDC_LISTENmi stenCButton侦听按钮IDC_SENDre_sendCButton发送按钮接着,再打开一个 VC建立客户机工程,工程名称为LX1,各个控件的ID如下表空件ID变量名绑定变量类型对应界面上的控件DC_CONTENTm_msgCStringt输入
13、发送内容的文本框DC_CONTENTm ctrlCEdit输入发送内容的文本框DC_CONNECTm_connectCButton连接按钮DC_SENDm_sendCButton发送按钮DC_IPm_lpCString输入连接目的IP的文本框然后,在 BOOL CLxlDig: OnlnitDialog() 和 BOOL CLx2Dlg: : OnlnitDialog()末尾添加语句,使其如下所示:m_send.EnableWindow(FALSE); / 使发送按钮变灰return TRUE ; /return TRUE unless you/set the focus to a con t
14、rol注意:这个语句作用使发送按钮失效,以免还未连接用户就点击发送,发生不可预计 的错误。为了在程序中更自由地处理CSocket得到的消息,必须新建 CSocket的派生类:在Lx2工程的工作区类视图中点击右键,添加新类:CServer,父类为CSocket。NewClass对话框AutomalionitypeThe toaftc clans在lx2Dlg . h里添加:"Server. h”头文件:#i ncludeprivate 变量: CServer m_server ; CServer m_recv 在对话框的图像上双击“侦听”按钮,添加如下代码:void CLx2Dlg :
15、 OnListen()re_server . Create(1000) ;/ 使用 1000 号端口m_server . Listen();/ 侦听在对话框图像上再双击“发送”按钮,添加如下代码:void CLx2Dlg : OnSend()UpdateData(TRUE) ;/更新数据,使 m_msg得到当前框中文本m_recv Send(m_msg, 255) ;/ 发送数据m_ctrlSetSel(0 ,一 1);/ 全选发送框文字m_ctrlReplaceSel( “”, TRUE); / 将发送框置空同样地,在 Lxl 工程的工作区类视图中点击右键,添加新类: Cclient它继承自
16、 CSocket 。在 CLxlDIg 类里添加 private 变量: CClient m_client ;双击对话框图像上的“连接”按钮,添加代码:void CLxlDlg : OnConnect()UpdateData(TURE) ;m_client.Create(1001) ;/ 使用 1001 号端口if(m_client.Connect(m_ip, 1000) / 连接目标地址, 1000 端口AfxMessageBox( “Client 端连接成功” ) ; m_send.EnableWindow(TRUE) ;/ 连接成功,可以发送m_connect.EnableWindow(
17、FALSE); / 同时禁止连接按钮elsem_client Close() ;/ 如果连接失败就关闭AfxMessageBox(” 连接失败”); 双击发送按钮,添加代码:void CLx 1Dig : OnSend() UlxlateData(TRUE) ;/ 更新数据,使 m_msg得到当前框中文本m_client.Send(m_msg,255) ;/ 发送数据,长度 255 字节)通过以上操作,我们建立了CSocket,主机、客户机建立连接后的消息发送代码也添加完成了,但是还缺少使其工作的消息机制。下面的步骤就是利用 OnAccept 和 OnReceive 函数处理 socket 消
18、息。首先,在 Lx2 工程的编辑界面中点击右键,选 Class Wizard ,在 classnamc 栏目里面 找到 CServer 类,添加 OnAccept 和 OnReceive 函数并且双击下面的 Memberfunction 栏目, 分别为两个函数添加如下代码:void CServer : OnAccept(int nErrorCode)/TODO : Add your specialized code here and/or call the base class CSocket : OnAccept(nErrorCode) ; (CLx2Dig*)(AfxGetApp()-&g
19、t;m_pMainWnd)->ShowAcccpt();/ 这里仅仅添加了这一句,因为 CLx2DIg 类是发送接收消息的主窗口,/ 而且应用程序发送接收的消息也在 CLx2Dlg 对象实例中进行,/ 所以当 CServer 类的对象收到客户机的 Connect 消息时,/便可调用CLx2DLg对象中的ShowAccept()函数处理。该步完成以后,可以为 CLx2DIg 类添加 public 成员函数 ShowAccept() :void CLx2Dlg : ShowAccept()m_server.Accept(m_recv) ;AfxMessageBox(”Server 端连接成功
20、” ) ;m_send.EnableWindow(TRUE) ;/ 连接成功,可以发送m_listen.EnableWindow(FAT SE) ; / 同时禁止侦听按钮于是,当客户机调用 m_client.Connect(m_ip,1000); 时,主机 server 端发现并调用ShowAccept 函数来建立连接。执行完以后, Socket 连接便被建立。接下来的工作便是添加发送聊天信息的函数了。注意到前面点击发送按钮的OnSend()函数已经添加好了,在Lx2工程中只要添加 Server端的接收消息和显示消息功能就可以进行消息的传送。在 CServer 类中像添加 OnAccept()
21、 一样添加成员函数 OnReceive() :void Cserver:OnReceive(int nErrorCode)/ TODO : Add your specialized code here and/or call the base classCSoeket : OnReceive(nErrorCode) : (CLx2DIg*)(AfxGetApp()->m_pMainWnd)->ShowMsg() ;建立连接后, 一方一旦发送数据, 另一方的 CSocket 派生类便调用该函数。 其中代码可以参考前面 OnAccept() 进行理解。在 CLx2DIg 里添加成员函数 ShowMsg():void CLx2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训机构安全教育课
- 2025综合文化活动中心租赁合同
- 2025订购茶叶合同模板
- 2025版合同:国内许可合同的格式
- 2025年房屋买卖合同
- 2025建筑工程补充合同
- 2024-2025教科版科学一年级下册第二单元测试卷及答案
- 2025年供气合同常用范本
- 小数的读法和写法教学设计
- 2025标准技术咨询合同范本
- GB/T 4909.2-2009裸电线试验方法第2部分:尺寸测量
- DB11-T 065-2022电气防火检测技术规范
- 09S304 卫生设备安装图集
- 肌肉注射操作评分标准
- 配电箱验收记录表
- DB11-T1788-2020技术转移服务人员能力规范
- 建设项目用地预审与选址意见课件讲解
- GB∕T 23524-2019 石油化工废铂催化剂化学分析方法 铂含量的测定 电感耦合等离子体原子发射光谱法
- 宝宝生日祝福可爱卡通电子相册PPT模板
- 盗窃案件现场勘查应注意的问题
- 用人单位职业健康监护档案(一人一档)
评论
0/150
提交评论