基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】

基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】

ID:463650

大小:1.23 MB

页数:52页

时间:2017-08-05

上传者:U-944
基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】_第1页
基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】_第2页
基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】_第3页
基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】_第4页
基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】_第5页
资源描述:

《基于Socket技术的Windows Mobile设备间的实时消息工具开发【开题报告+文献综述+毕业论文】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

本科毕业论文系列开题报告电子信息工程基于Socket技术的WindowsMobile设备间的实时消息工具开发一、课题研究意义及现状Socket是建立在传输层(主要是TCP和UDP)协议上的一种套接字规范,由美国加州Berkley大学提出,为UNIX操作系统开发的网络通信接口,它既定义了两台计算机间的通信规范,又定义了一种编程规范。如果两台计算机是利用一个通道进行通信,那么这个通道的两端就是套接字。Socket屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了Socket规范的计算机之间的通信成为可能。Socket接口是TCP/IP网络最为通用的API,也是在Internet上进行应用开发最通用的API。实时系统是一种带有时间约束特性的复杂的计算机控制系统,其根本要求是计算机提供的计算能力必须能够满足各种各样的复杂实时任务的时间要求。WindowsMobile是基于一系列智能设备的操作系统(例如,PocketPC,PocketPCPhone和Smartphone)。WindowsMobile与微软的Windows操作系统很相似,拥有与Windows操作系统同样强大的功能,同时拥有相似的操作方式。当前的WindowsMobile设备一般都配置了无线局域网模块,具备了实时宽带连接的能力。对WindowsMobile设备进行基于Socket的实时消息工具开发,具有重要的实践意义和广泛的应用前景。二、课题研究的主要内容和预期目标主要内容:研究WindowsMobile设备上基于Socket的实时消息交互方法并用VisualStudio2008进行软件开发。预期目标:能够扫描当前的无线环境,发现周围的设备,显示他们的名字、MAC地址、信号强度(RSSI)、WiFi信道以及是否需要密码等信息,在利用WiFi建立设备与设备之间的连接之后,实现基于Socket的实时消息交互,并通过VisualStudio2008进行软件开发。三、课题研究的方法及措施 研究方法:本课题将嵌入式系统与Socket技术相结合,利用WindowsMobile设备上的WiFi建立设备与设备之间的连接,通过VisualStudio2008软件编写程序,实现基于Socket的实时消息交互。措施:首先通过查找资料熟悉Socket技术的基本原理,以及WindowsMobile设备上Socket的使用方法。然后熟悉VisualStudio2008的开发环境,了解C#程序的写法,通过学习和理解纂写所需要的软件需求文档。最后根据软件需求分析,列出所需要实现的功能,并且利用VisualStudio2008来实现,同时在真实设备中进行调试。四、课题研究进度计划2010.10.18~2010.11.19:阅读相关文献并撰写文献综述,完成外文文献的翻译,完成开题报告。2010.11.19~2010.12.31:掌握毕业设计课题基本内容并用VisualStudio2008进行软件开发。2011.1.1~2011.1.21:撰写毕业设计论文,完成初稿。2011.2.22~2011.4.1:对毕业论文进行修改,完成最终稿。2011.4.2~2011.4.15::上交毕业设计相关文档,准备好答辩PPT。五、参考文献[1]李远杰,刘渭锋等.主流即时通软件通信协议分析[J].计算机应用研究,2005,7(2):245-250.[2]凌泽军,魏文娟,孙震强.智能终端的主流平台-WindowsMobile分析[J].中国电信股份有限公司北京研究院《移动通信》,2010,9(3):78-81.[3]刘骏,颜钢锋.基于Socket的网络编程技术及其实现[J].江南大学学报(自然科学版),2004,3(3):250-251.[4]李存斌,汪兵.深度编程及项目应用开发[M].北京:中国水利水电出版社,2002,180-188.[5]臧绍刚,梁晟,傅光轩.Socket网络应用程序从IPv4向IPv6的转换[J].通信学报,2006,11(27):25-27.[6]周炎涛,李立明.TCP/IP协议下网络编程技术的实现[J].航空计算技术,2002,32(30):122-125.[7]郑小红,芦东昕,谢鑫.一种嵌入式实时消息通信方法[J].计算机工程,2005,13(31):192-194.[8]胡柯,颉谭成,董秀林.基于TCP/IP和Socket的网络文件传送[J].河南科技大学学报( 自然科学版),2003,24(4):53-54.[9]周坤,傅德胜.基于WindowsSocket的网络数据传输及其安全[J].计算机工程与设计,2007,22(28):5381-5386.[10]鲁耀斌,徐红梅.即时通讯服务使用行为的影响因素实证研究[J].管理学报,2006,5(3):615-620.[11]黄昶,张燕,沈建国.即时消息传递系统的智能代理[J].计算机应用研究,2004,6(10):257-260.[12]冯朝胜,邓婕,秦志光.通讯设备中实时消息通信方法的设计与实现[J].计算机工程,2005,4(20):372-374.[13]DavidMcNeill,MiguelQuintana.Instantmessage[J].NewScientist,2007,196(2630):185-186.[14]LawtonG.Instantmessagingputsonabusinesssuit[J].Computer,2003,36(3):17-26. 毕业论文文献综述电子信息工程Socket与实时消息技术综述摘要:在当今的信息时代,人们之间的信息交流越来越频繁,即时通信软件应运而生。这些主流的即时通信软件拥有绝大部分的用户群,而且随着功能的完善,服务的加强,对用户的影响将越来越大,因此对即时通信软件的监控和通信协议分析变得越来越重要。WindowsMobile是目前主流的移动开发平台之一,研究该平台上的基于Socket技术的实时消息通信,具有重要的现实意义和广泛的应用前景。关键词:Socket技术;WindowsMobile;实时消息1.引言WindowsMobile平台是微软推出的手机操作系统平台,除了基本的通信功能外,还提供了其他许多强大的功能。在移动办公方面,系统内置了Word,Excel等常用的办公软件,也支持全新的Office2007版本,还有强大的邮件管理功能,全面的联系人管理功能。在娱乐方面,MediaPlayer多媒体播放器可以检索到存放在手机中的音频,视频文件,能够跟个人电脑中的播放列表完成同步[1]。在PC同步方面,可与个人电脑进行完美的信息同步,让手机随时保持数据更新。电脑中所有的日程安排,都可以同步到手机上。让电脑与手机随时保持数据一致。WindowsMobile提供类似PC的界面呈现方式[2]。让用户看的比较透彻,使用起来比较容易上手。最新的WM6.5版本去除了开始菜单设计,新增了开始屏幕、锁定屏幕和今日屏幕三种显示方式。WindowMobile平台内置IEMobile浏览器。基于Trident浏览器引擎,为用户提供类似桌面浏览器的操作体验,最新的IEMobile6提供对网页Flash的支持。并且部分支持AJAX技术;提供桌面模式和移动模式两种浏览模式,让用户选择以PC方式浏览网页。2.Socket基本原理Socket是建立在传输层(主要是TCP和UDP)协议上的一种套接字规范,最初由美国加州Berkley大学提出,为UNIX操作系统开发的网络通信接口,它定义了两台计算机间的通信规范(也是一种编程规范)。如果两台计算机是利用一个通道进行通信,那么这个通道的两端就是套接字。Socket屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了Socket规范的计算机之间的通信成为可能[3]。Socket接口是 TCP/IP网络最为通用的API,也是在Internet上进行应用开发最通用的API。在Windows网络编程中,套接字接口主要有3种类型:流式套接字,数据报套接字以及原始套接字。流式套接字定义了一种面向连接的服务,实现了无差错无重复的顺序数据传输,无长度限制。数据报套接字接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不一定可靠[4]。原始套接字允许对低层协议IP或ICMP直接访问,主要应用网络协议的测试,例如Windows带的Ping程序,就是通过ICMP实现的[5]。要创建一个Socket接口,至少要提供3个参数:协议簇、接口类型和接口协议。协议簇:PF_INET表示支持IPv4协议,PE_INET6表示支持IPv6协议。接口类型:SOCK_STREAM表示基于TCP的字节流接口,;SOCK_DGRAM表示基于UDP的Socket接口;SOCK_RAW表示原始Socket接口,主要用于Socket的高级编程[6]。TCP是面向连接的、可靠的数据传输服务,数据无重复、无差错发送,且按发送顺序接收[7]。UDP是面向无连接的数据传输服务,数据以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱[8]。WindowsSocket是一种网络编程接口,它定义一组标准例行函数,应用程序通过调用这些函数可以和不同网络中的应用程序进行通信而不必担心网络协议不同所引发的问题。在TCP/IP网络协议下,根据传输数据类型的不同,Socket主要分为3类[9]:流式套接字(SOCK_STREAM)。在这种方式下,两个的应用程序之间要先建立一种虚拟的连接,它采用TCP协议,提供一个面向连接、可靠、有序的数据传输服务,对数据有校验和重发机制数据报套接字(SOCK_DGRAM)。它采用UDP协议,提供一个无连接服务,数据可能丢失或重复,并且接收顺序混乱,由于它取消了校验重发机制,能够提高通讯速率,可以用作一些对数据可靠性要求不高的通讯。原始式套接字(SOCK_RAM)。该接口允许对较低层协议,如IP、ICMP直接访问。套按字在客户机/服务器模式,点对点模式,远程程序调用(RPC)3种通信环境下广泛应用。3.实时消息实时系统是一种带有时间约束特性的复杂的计算机控制系统,其根本要求是计算机提供的计算能力必须能够满足各种各样的复杂实时任务的时间要求[10] 。混合实时消息系统通过对象请求代理,扩展了传统的C/S模式,建立了稳定、灵活、快速响应的三层分布式系统结构,解决了因底层服务设施暴露于应用而导致危险的问题,实现了客户远程调度服务;并基于JMS规范,实现统一的消息格式,提供多种通信模式,采用消息队列实现异步、可靠消息传输,消息事务和消息过滤功能,搭建了应用与应用之间,应用模块之间以及企业之间的消息交流通道。混合实时消息的调度构建于一种层次调度模型的基础上,在调度对象上,将传统的简单任务扩充为开放式的复杂任务组-服务器对,并分析了系统对混合实时消息的可调度性;利用调度机制与调度策略的分离,解决了多类型调度策略的有机集成,实现了开放性的混合实时调度框架;并通过提出服务器虚拟化技术,采用面向服务的设计,以线程并行化为服务载体,完成混合实时消息的调度工作,保证了各类实时性要求[11]。在嵌入式实时多任务系统中,从宏观上看多个任务是并行的;从微观上看,多个任务是串行工作的。这种多任务的实时通信以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、控制等对高精尖技术及实时性要求极高的领域中[12]。然而,在现代操作系统中,任务之间通信,多是通过系统区的buffer来进行多次拷贝来交换数据,降低了实时系统的性能,同时,不同任务之间的切换和访问同步互斥的系统开销也不容忽视。最近几年通信技术的飞速发展,实时计算逐步兴起,实时系统也已经被广泛应用于人类社会生活中的诸多领域。单机实时系统已不能很好的满足实际应用需求,近些年提出的实时通信网络解决方案为分布式实时系统的发展提供了基础[13]。它尝试从调度算法、设置优先级和资源预留等方面解决网络传输中实时性的问题。在控制过程、检测过程和生产过程等工业自动化的领域中,分布式实时系统的应用将能为系统带来更好的安全性和可靠性[14]。4.总结:综上所述,本文主要讲述了WindowsMobile移动开发平台的一些功能,Socket技术的基本原理以及该平台基于Socket技术的实时消息通信。WindowsMobile与微软的Windows操作系统很相似,拥有与Windows操作系统同样强大的功能,同时拥有相似的操作方式。目前3G时代的到来,对于该技术的研究具有重要的现实意义和广泛的应用前景。参考文献:[1]李远杰,刘渭锋等.主流即时通软件通信协议分析[J].计算机应用研究,2005,7(2):245-250.[2]凌泽军,魏文娟,孙震强.智能终端的主流平台-WindowsMobile分析[J].中国电信股份有限公司北京研究院《移动通信》,2010,9(3):78-81.[3]刘骏,颜钢锋.基于Socket的网络编程技术及其实现[J].江南大学学报(自然科学版),2004,3(3):250-251.[4]李存斌,汪兵.深度编程及项目应用开发[M].北京:中国水利水电出版社,2002,180-188.[5]臧绍刚,梁晟,傅光轩.Socket网络应用程序从IPv4向IPv6的转换[J].通信学报,2006, 11(27):25-27.[6]周炎涛,李立明.TCP/IP协议下网络编程技术的实现[J].航空计算技术,2002,32(30):122-125.[7]郑小红,芦东昕,谢鑫.一种嵌入式实时消息通信方法[J].计算机工程,2005,13(31):192-194.[8]胡柯,颉谭成,董秀林.基于TCP/IP和Socket的网络文件传送[J].河南科技大学学报(自然科学版),2003,24(4):53-54.[9]周坤,傅德胜.基于WindowsSocket的网络数据传输及其安全[J].计算机工程与设计,2007,22(28):5381-5386.[10]鲁耀斌,徐红梅.即时通讯服务使用行为的影响因素实证研究[J].管理学报,2006,5(3):615-620.[11]黄昶,张燕,沈建国.即时消息传递系统的智能代理[J].计算机应用研究,2004,6(10):257-260.[12]冯朝胜,邓婕,秦志光.通讯设备中实时消息通信方法的设计与实现[J].计算机工程,2005,4(20):372-374.[13]DavidMcNeill,MiguelQuintana.Instantmessage[J].NewScientist,2007,196(2630):185-186.[14]LawtonG.Instantmessagingputsonabusinesssuit[J].Computer,2003,36(3):17-26. 本科毕业设计(20届)基于Socket技术的WindowsMobile设备间的实时消息工具开发 摘要在当今的信息时代,人们之间的信息交流越来越频繁,即时通信(InstantMessage,IM)软件应运而生,立即受到广大互联网用户的喜爱。在国内有腾讯的QQ,国外有ICQ,AIM,MSN和YahooMessenger等即时通信软件。这些主流的即时通信软件拥有绝大部分的用户群,而且随着功能的完善,服务的加强,对用户的影响将越来越大,因此对即时通信软件的监控和通信协议分析变得越来越重要。WindowsMobile是目前主流的移动开发平台之一,研究该平台上的基于Socket技术的实时消息通信,具有重要的现实的意义和广泛的应用前景。本课题将嵌入式系统与Socket技术相结合,利用WindowsMobile设备上的WiFi建立设备与设备之间的连接,通过VisualStudio2008软件编写程序,实现基于Socket的实时消息交互。文章首先介绍了Socket的一些功能以及其编程的基本原理,WindowsMobile操作平台的一些优缺点。最后进行深入研究,对基于Socket技术的WindowsMobile设备间的实时消息工具进行开发,最终达到扫描当前的无线环境,发现周围的设备,显示他们的名字、MAC地址、信号强度(RSSI)、WiFi信道以及是否需要密码等信息。关键词:Socket技术;WindowsMobile;消息 AbstractIntoday'sinformationage,informationexchangesbetweenpeoplebecomemoreandmorefrequent,IM(InstantMessage,IM)softwarecameintobeing.AnditispopularamongmajorityofInternetusers,suchasTencentQQ,ICQ,AIM,MSN,andYahooMessengerandotherinstantmessagingsoftware.Theinstantmessagingsoftwarehasmostoftheuserbase.Withthedevelopmentoffeaturesandservices,theimpactonuserswillbedeeperanddeeper.Sothemonitoringandcommunicationprotocolsanalysisofreal-timecommunicationsoftwarebecomesmoreandmoreimportant.WindowsMobileiscurrentlyoneofthemainstreammobileplatforms.Itisofgreatrealisticsignificanceandwideapplicationsprospectstostudythereal-timemessagecommunicationbasedonSockettechnology.Inthispaper,theembeddedsystemandSockettechnologywillbecombined.ConnectionsbetweenWindowsMobiledevicesareestablishedbyWi-Fi.Implementationofreal-timemessagebasedonSocketinteractionisachievedbyVisualStudio2008softwaredevelopment.Firstofall,thearticleintroducessomeofthefunctionsanditsSocketprogrammingprinciple,someoftheadvantagesanddisadvantagesofWindowsMobileplatforms.Finally,byin-depthstudiesonWindowsMobileDeviceofSockettechnology,real-timemessagingtoolsaredevelopedtoscanthewirelessenvironment,findtheperipheralequipment,displayedtheirnames,MACaddress,RSSI,Wi-Fichannelandpasswordinformation.Keywords:Socket;WindowsMobile;Message 目录1引言11.1研究背景11.2研究内容11.3研究现状22基于SOCKET技术的网络通信32.1Socket技术的历史32.2Socket技术的原理32.3Socket协议简析42.4Socket通信机制53基于SOCKET技术的实时消息工具开发83.1开发平台简介83.2开发工具简介83.3开发流程93.3.1TCP/IP协议接口93.3.2WindowsMobile平台基于Socket的多服务器通信113.3.3WindowsMobile平台上Ad-hoc网络的建立123.3.4应用程序的开发153.4程序测试184结论19致谢20参考文献21附录程序源代码22 1引言1.1研究背景两个程序在网络上通过一个双向的通讯连接实现数据的交换,这个链路的一端就称为一个Socket。客户端和服务端的连接可以用Socket来实现。用Socket编程的目的是为了解决网间进程通信问题。Socket接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程之间的通信,且支持网络通信功能[1]。提出Socket以后,由于应用的需求,各种Socket接口都在主流操作系统中增加了。如Winsock是WindowsNT下的;PC/TCPsocketAPI是DOS下的等等。对socket做了一定的扩充是为了适应各类操作系统的要求。各类操作系统扩充后的socket套接口之间的交集,我们称之为“Berkeleysocket”。套接字是网络通信的基石,通信的一端就是一个套接字。在这一段上可以找到与其对应的名字。一个正在被使用的套接字都有它的类型和与其相关的进程。在通信域中存在套接字。通信域其实是一种抽象的概念,是为了处理一般的线程通过套接字通信而引进的。1.2研究内容本论文首先对socket技术的基本原理以及WindowsMobile设备上Socket的使用方法进行详细的阐述;然后熟悉VisualStudio2008的开发环境,了解C#程序的写法,通过学习和理解纂写所需要的软件需求文档。最后根据软件需求分析,列出所需要实现的功能,并且利用VisualStudio2008来实现,同时在真实设备中进行调试。本课题将嵌入式系统与Socket技术相结合,利用WindowsMobile设备上的WiFi建立设备与设备之间的连接,通过VisualStudio2008软件编写程序,最后实现基于Socket的实时消息交互,能够扫描当前的无线环境,发现周围的设备,显示他们的名字、MAC地址、信号强度(RSSI)、WiFi信道以及是否需要密码等信息。 1.3研究现状美国加州Berkley大学提出了Socket,在传输层(主要是TCP和UDP)协议上的一种套接字规范,为UNIX操作系统开发的网络通信接口就是Socket,通信规范和编程规范都是由它定义的。Socket屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了Socket规范的计算机之间的通信成为可能[2]。TCP/IP网络最为通用的API就是Socket接口,也是在Internet上进行应用开发最通用的API。实时系统是一种带有时间约束特性的复杂的计算机控制系统,其根本要求是计算机提供的计算能力必须能够满足各种各样的复杂实时任务的时间要求[3]。WindowsMobile是基于一系列智能设备的操作系统(例如,PocketPC,PocketPCPhone和Smartphone)。WindowsMobile与微软的Windows操作系统很相似,拥有与Windows操作系统同样强大的功能,同时拥有相似的操作方式。当前的WindowsMobile设备一般都配置了无线局域网模块,具备了实时宽带连接的能力[4]。对WindowsMobile设备进行基于Socket的实时消息工具开发,具有重要的实践意义和广泛的应用前景。 2基于Socket技术的网络通信2.1Socket技术的历史在80年代早期,佳利福尼亚大学伯克利分校的一个研究组是由远景研究规划局资助的,在UNIX操作系统中,他们成功的移植了TCP/IP软件。作为项目的一部分,设计者们创建了一个接口,应用进程通过这个接口就可以方便的进行通信。他们决定,只要有可能就使用以有的系统调用,对那些不能方便的容入已有的函数集的情况,就再增加新的系统调用以支持TCP/IP功能。插口接口(BerkeleySocket)就这样出现了,BerkeleyUNIX或BSDUNIX就是这个系统。BerkeleyUNIX被许多计算机厂商采用,这样,Socket接口就被广泛使用,到现在已经成为事实上的标准。2.2Socket技术的原理“孔”或“插座”其实就是Socket的直观表示。现在作为BSDUNIX的进程通讯机制。日常中的插座,有信号插座,有电源插座,有的可以接受信号(或能量),有的可以发送信号(或能量)。本文中所提到的Socket则非常相似于电话插座。就以我们国家级的电话网为例:通话的双方就相当于相互通信的两个进程;通话双方所在的地区相当于一个网络,区号是它的网络地址;区内的一个单位的交换机相当于一台主机,文中提到的Socket就相当于主机分配给每个用户的号码。每个用户在打电话的时候,则必须要有一部电话机,也就是说必须要申请一个Socket号;同时也必须知道对方的号码,这个号码就是对方的Socket号。然后拨号呼叫对方,相当于一个连接请求(如果对方不在同一地区,但也要拨号给对方,相当于给出网络地址)。如果对方在场并且闲置,那么双方拿起电话听筒,就可以正式通话,相当于一个成功的连接。彼此通话的过程,其实就是发出信号给电话机和从电话机接受信号,也就是Socket发送和接收数据的过程。双方通话结束后,则相当于对方挂起电话机,对方的Socket关闭,连接结束。 利用网间网通信设施能够实现Socket进程通信,Socket通信对设施的细节不关心,只要设施有通信能力,它就能进行进程通信。上面所描述的其实是我们对Socket通信的直观描述。抽象出来,进程通信的端点实质上就是Socket端口。如果双方想要进行通信,那么双方必须要彼此创建一个端点,否则没法通信,没法联系。每一个Socket都有一个本地的Socket号并且是唯一的,由操作系统来分配。最重要的是,Socket是面向客户-服务器模型而设计的。客户随机申请一个Socket号,服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求。Socket利用客户/服务器模式巧妙的解决了进程之间建立通信连接的问题。服务器Socket为全局所公认非常重要。两个完全随机的用户进程之间,因为没有任何一方的Socket是固定的,要通话是不可能的。2.3Socket协议简析表2-1对Socket通信协议做了简单的简析。表2-1Socket通信协议Socket通信流式套接字流式套接字定义了一种面向连接的服务,实现了无差错无重复的顺序数据传输。数据报套接字数据报套接字接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不一定可靠。原始套接字原始套接字允许对低层协议IP或ICMP直接访问,主程序,就是通过ICMP实现的[6]。要应用网络协议的测试,例如Windows带的Ping程序,就是通过ICMP实现的。表2-2阐述了创建一个Socket必须要3个参数:协议簇,接口类型,接口协议。这3个协议主要用于Socket的高级编程[7]。表2-2创建Socket的参数创建一个Socket协议簇PF_INET表示支持IPv4协议,PE_INET6表示支持IPv6协议; 接口类型SOCK_STREAM表示基于TCP的字节流接口;SOCK_DGRAM表示基于UDP的Socket接口;SOCK_RAW表示原始Socket接口;接口协议TCP协议;UDP协议TCP是面向连接的、可靠的数据传输服务,数据无重复、无差错发送,且按发送顺序接收[8]。UDP是面向无连接的数据传输服务,数据以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱[9]。客户机服务器Socket(分配套接字)字)Socket(分配套接字)字)Bind(绑定地址)Bind(绑定地址)连接请求accept(接受连接)Connect(连接)接受连接recv(接收数据)Send(发送数据)send(发送数据)Recv(接收数据)CloseSocketCloseSocket图2-1TCP协议通信的套接字程序流程结构WindowsSocket是一种网络编程接口,它定义一组标准例行函数,应用程序通过调用这些函数可以和不同网络中的应用程序进行通信而不必担心网络协议不同所引发的问题。2.4Socket通信机制Socket是一个能够与远程计算机相互通信的底层API,是开发网络应用程序的核心元素,其应用基本都基于服务器和客户端[11]。表2-3分别阐述了Socket通信机制的2种方式的优缺点。 表2-3Socket通信机制的两种方式Socket通信机制流方式采用的是TCP协议,提供双向的、有序的、无重复并且无记录边界的数据流服务。应用程序间的通信需要建立连接,使用连接和终止连接三个过程,其数据收发顺序一致,内容相同。其特点是通信可靠,对数据有校验和重发,适合大量的数据传输。数据报方式采用UDP协议,提供无连接数据报传输,支持双向的数据流,但是不保证其是否可靠,有序,无重复。也没有重发机制。但是可以达到较高的通信速率。图2-2描述了Socket通信的简单过程。其过程如下:当服务器向客户机发出建立Sever请求,并且在指定的端口监听,客户机收到请求,并且建立Socket对象,那么客户机就会向服务器发出建立连接。那么服务器也会建立Socket对象。此时客户端会发出服务请求,那么服务器就会读取客户的请求,从而处理并返回结果。服务器就读取数据。那么,一次完整的通信就完成了。服务器客户机建立Socket对象建立Sever请求发起连接请求在指定端口监听建立连接建立Socket对象发出服务请求请求读取客户请求读取数据处理并返回结果响应 图2-2Socket通信机制TCP/IP是目前为止发展最成功的通信协议之一。TCP与UDP均是OSI(开放系统互连)网络模型的上层通信协议,但它们存在区别。TCP是连接型的通信协议,通信双方在进行数据交换前,必须建立一条路径(连接),建立连接后,客户发送确认信息,然后发送数据,当服务器接收到数据后也向客户机发送确认信息。为保证发送无误,有时还需要执行额外的计算来验证其正确性,所以TCP可以实现可靠的传输层服务。UDP是一种无连接协议,其传输过程类似于传递邮件:消息从一端发送到另一端,两者之间没有显示的连接,它需要程序员完善程序内容,以加强通信的可靠性。客户端服务器请求建立连接连接已建立确认数据传输确认图2-3TCP协议通信过程节点2节点1数据传输1数据传输2数据传输3 图2-4UDP通信协议3基于Socket技术的实时消息工具开发3.1开发平台简介WindowsMobile平台是微软推出的手机操作系统平台,除了基本的通信功能外,还提供了其他许多强大的功能。在移动办公方面,系统内置了Word,Excel等常用的办公软件,也支持全新的Office2007版本,还有强大的邮件管理功能,全面的联系人管理功能。在娱乐方面,MediaPlayer多媒体播放器可以检索到存放在手机中的音频,视频文件,能够跟个人电脑中的播放列表完成同步。在PC同步方面,可与个人电脑进行完美的信息同步,让手机随时保持数据更新。电脑中所有的日程安排,都可以同步到手机上。让电脑与手机随时保持数据一致。WindowsMobile提供类似PC的界面呈现方式[13]。让用户看的比较透彻,使用起来比较容易上手。最新的WM6.5版本去除了开始菜单设计,新增了开始屏幕、锁定屏幕和今日屏幕三种显示方式。WindowMobile平台内置IEMobile浏览器。基于Trident浏览器引擎,为用户提供类似桌面浏览器的操作体验,最新的IEMobile6提供对网页Flash的支持。并且部分支持AJAX技术;提供桌面模式和移动模式两种浏览模式,让用户选择以PC方式浏览网页。3.2开发工具简介Visualstudio2008是微软公司推出的新一代开发工具,支持多种编程语言。Visualstudio2008具有强大、快捷的数据库开发技术,利用它可以轻松访问各类数据库,如AccessDatabase、SQLServer等,实现数据的显示、存取、查询。从建模到编码和调试,VisualStudio2008对编程语言、设计器、编辑器和数据访问功能进行了全面的提升,确保开发人员能快速创建互连应用程序:VisualStudio 2008为开发人员提供了一些新的工具,在最新的平台上快速地构建杰出的、高度人性化用户体验的和互联的应用。3.3开发流程3.3.1TCP/IP协议接口TCP/IP协议对应于一个四层概念模型,称作DARPA模型。DARPA模型的四层分别为:应用层、传输层、网际层和网络接口层。应用层应用层表示层会话层主机到主机传输层传输层网络层网络层数据连接层网络接口层物理层图3-1DARPA模型 上图3-1是TCP/IP协议对应于一个四层概念模型,称作DARPA模型。(1)网络接口层负责把TCP/IP包放到网络传输介质上和从网络传输介质上接收TCP/IP包。TCP/IP的设计独立于网络访问方法、帧格式和传输介质。通过这种方法,不同类型的网络可以用TCP/IP连接起来,包括局域网拓扑结构,以及广域网拓扑结构。网络接口层包括OSI模型中的数据链路层和物理层。网络接口层假定是不可靠的,通过会话建立、编号和包应答进行可靠通信是传输层的任务。FTRDNSRIPTelentSMTPSNMPUDPTCPIPIGMPICMPARPATM帧中继以太网令牌网图3-2TCP/IP协议的体系结构(2)网际层Internet层具有负责寻址、打包和路由选择的功能。IP、ARP、ICMP和IGMP等都是Internet层的核心协议。IP是一个路由协议,负责IP寻址、路由选择、分段及包重组。ARP负责把Internet层地址解析成网络接口层地址。ICMP负责提供诊断功能,报告由于IP包投递失败而导致的错误。IGMP负责管理IP组。Internet层类似于OSI模型中的网络层。(3)传输层 传输层负责给应用层提供会话和数据报通信服务。传输控制协议(TCP)和用户数据报协议(UDP)是传输层的核心协议。TCP提供点到点的、面向连接的可靠通信服务。TCP负责建立TCP连接,对发送包进行编号和应答,并恢复传输期间丢失的包。UDP提供点到点或点到多点、无连接的不可靠通信服务。UDP在如下情况下使用:要传输的数据量少(比如数据能装入单个包中);建立TCP连接的开销不必要:应用程序或上层协议能提供可靠的投递。传输层包含OSI传输层及部分OSI会话层的功能。(4)应用层应用层给应用程序提供访问其他层服务的能力并定义应用程序用于交换数据的协议。最常用的应用程序协议是那些用来交换用户信息的:包含超文本传输协议(HTTP),文件传输协议(FTP),简单邮件传输协议(SMTP),域名系统(DNS)路由选择信息协议(RIP),简单网络管理协议(SNMP)。HTTP用于传输组成万维网(WorldWideWeb)Web页面的文。FTP用于交互式文件传输。SMTP用于传输邮件消息和连接。DNS用于把主机名解析成IP地址。RIP,路由器可以用它在IP网络上交换路由选择信息。SNMP用于在网络管理控制台和网络设备之间选择和交换网络管理信息。3.3.2WindowsMobile平台基于Socket的多服务器通信(1)客户端根据服务器端的监听端口,在客户端创建Socket;发起与服务器的连接请求,连接成功后,同样用send和receive方法建立数据流,从而实现与服务器的数据交换。网络通信完毕后,关闭Socket连接。(2)服务器端在服务器端,首先创建服务器套接字,并将其绑定到指定端口上:服务器通过该端口监听来自客户端的连接请求:当客户端有请求到来时,accept()函数返回一个Socket,完成客户端与服务器的连接,服务器接受连接之后,以处理I/O数据流的方式和客户机进行通信,并使用Socket对象中的send和receive,从而实现与客户机的数据交换。(3)多用户多服务器结构 Socket标识双向通信的一端,当客户机请求与某一特定端口处的服务器相连时,该服务器识别并跟踪用于与服务器交流的Socket。这种机制使客户端可以通过同一端口与多个服务器通信。服务器掌握每一个客户机的Socket,并能分辨来自不同的客户机的数据。它根据Socket分别对不同的客户机的请求做出不同的响应。在多线程机制下,服务器可以产生数个进程,以分别维护不同客户的连接,从而实现对多客户的并发通信。由于客户端在处理一个服务器会话时会等待客户请求而进入阻塞操作,为了能与多服务器同时通信,客户端引入多线程处理机制,各种应用对多线程的封装有所不同,但从根本上,客户端循环发送连接,当成功连接一个服务器的时候,建立一个socket,并创建一个新的进程,将该socket交给新进程,让新进程去完成与特定服务器的数据交换。客户端主进程则继续监听指定端口,直至终止程序。3.3.3WindowsMobile平台上Ad-hoc网络的建立一般情况下,我们都会使用WindowsMobile设备上的WiFi模块来接入AccessNode,从而达到上网的目的。通过此方法我们可以扫描当前的无线环境,发现周围的AP接入点,显示他们的名字、MAC地址、信号强度(RSSI)、Wifi信道以及是否需要密码等信息。那么,我们能否利用WiFi来建立设备与设备之间的连接呢?其实就是所谓的Ad-hoc网络(或者说是点对点/P2P)如何在WindowsMobile设备上来建立的问题。如果说是在WindowsMobile设备上建立点对点的连接,那Bluetooth不就可以实现吗?的确,利用Bluetooth建立设备与设备之间的连接确实是许多移动设备上的主流。另一方面,Bluetooth与WiFi相比,其带宽的劣势比较明显,而且传输距离也没有WiFi远。当然了,一般来说,WiFi的功耗是要比Bluetooth大的,但是在某些应用场景下,我们侧重的是带宽和距离。因此,从以上分析来看,利用WiFi在WindowsMobile设备上建立点对点的连接,还是具备应用意义的。我就以WindowsMobile2003seforPocketPC和WindowsMobile6Professional为例,一步一步给出配置步骤。首先,我们确定以WindowsMobile2003seforPocketPC设备为Server,WindowsMobile6 Professional设备为Client。打开WiFi,然后点击设置-》添加新的,这里设置网络名称为“MyPPCNet”,并选中“这是设备至设备(特定)连接”,如下图3-3所示。图3-3对WIFI的设置在网络密钥中,选择验证已打开,数据加密已禁用(也可以自行选择数据加密)。设置完成后,点击“OK”,在无线网络中,出现了“MyPPCNet”,长击它,在出来的右键菜单中,选择“连接”,使得该网络处于“连接”状态,如下图3-4所示。图3-4无线网络的配置Server端设置完以后,我们转向Client端,打开无线网络,然后在设置-连接中选择“WiFi”,系统会列出一堆扫描到的无线网络,从中我们可以发现刚刚在Server端建立的“MyPPCNet”,如下图3-5所示。 图3-5Client端的设置在Client端设置“MyPPCNet”时,要根据Server端的设置来做,特别是身份验证和数据加密等选项,如下图3-6所示。图3-6Client端的“MyPPCNet”设置一会儿,就可以发现“MyPPCNet”处于连接状态了,我们还可以查到其MAC地址、模式、信道等信息,如下图3-7所示。 图3-7MAC地址、模式、信道等信息的显示至此,Server端和Client端之间的Ad-hoc网络已经建立。3.3.4应用程序的开发上面讲述了利用WiFi在WindowsMobile上建立Ad-hoc网络的方法,并且在WindowsMobile6与WindowsMobile2003seforPocketPC给出了演示。那么,点对点的Ad-hoc网络能够完成什么功能呢?一方面,它可以用来消息的实时发送与接收,也就是俗称IM(InstantMessenger);另一方面,可以用来传送文件。这里主要讲述如何利用Socket来实现WindowsMobile设备之间的IM(其实WindowsMobile设备与PC同步以后,可以通过Socket与PC实现通信)。1应用分为Server端和Client端。2开发环境为VisualStudio2008+WindowsMobile2003forPocketPCSDK+WindowsMobile6ProSDK,使用MFC来开发。3新建项目的时候,在AdvancedFeatures选项中,选中WindowsSockets,以添加对Socket的支持。如下图3-8所示。. 图3-8在AdvancedFeatures选项中添加对Socket的支持4设计Server端和Client端简单的UI,如下图3-9所示。图3-9Sever和Client端简单UI的显示5通过AddVariable为控件添加成员变量。6Server端和Client端的文件组成如下图3-10所示。 图3-10Client端文件的组成图3-11Sever端文件的组成 7在Client端,CTCPClient_CE类完成TCP客户端操作的封装,然后在对话框中调用该类与TCP服务器建立连接,并进行数据传输,最后再断开与服务器的连接。在Server端,CTCPServer_CE类负责监听客户端的连接,一旦客户端有连接请求,它就负责接收此连接,并创建一个新的CTCPCustom_CE对象与客户端进行通讯。而CTCPServer_CE类接着监听客户端的连接请求。3.4程序测试按照利用WiFi在WindowsMobile上建立Ad-hoc网络的方法,利用WiFi在WindowsMobile上建立Ad-hoc网络。在WindowsMobile2003seforPocketPC设备上运行Server端程序,在WindowsMobile6Professional设备上运行Client端程序,如下图3-12所示。图3-12设备检测截图注:Server端和Client端均采用异步Socket方式通信。 4结论本文重点阐述了基于socket技术的windowsmobile设备间的实时消息工具开发。文中描述了socket其实是一种套接字规范,它是建立在传输层协议上的。要是两台通信设备要进行通信,那么两端就是套接字。socket接口是TCP/IP网络最为通用的API,也是目前运用最广泛的。在开发流程上,本文重点演示了客户端与服务器端如何通信,当有多个客户端同时连接到服务器端时,服务器端如何识别每个客户端,并对请求给出相应的回复。为了保证一个客户端断开连接时不影响其它客户端与服务器端的通信,同时保证服务器端能够正确回复客户端的请求。 参考文献[1]李远杰,刘渭锋等.主流即时通软件通信协议分析[J].计算机应用研究,2005,7(2):245-250.[2]刘骏,颜钢锋.基于Socket的网络编程技术及其实现[J].江南大学学报(自然科学版),2004,3(3):250-251.[3]鲁耀斌,徐红梅.即时通讯服务使用行为的影响因素实证研究[J].管理学报,2006,5(3):615-620.[4]中国移动通信集团公司研发中心.中国移动通信信息资源站实体与互联网短消息网关接口协议第2版北京:中国移动通信集团公司,2002:6-9.[5]李存斌,汪兵.深度编程及项目应用开发[M].北京:中国水利水电出版社,2002,180-188.[6]臧绍刚,梁晟,傅光轩.Socket网络应用程序从IPv4向IPv6的转换[J].通信学报,2006,11(27):25-27.[7]周炎涛,李立明.TCP/IP协议下网络编程技术的实现[J].航空计算技术,2002,32(30):122-125.[8]郑小红,芦东昕,谢鑫.一种嵌入式实时消息通信方法[J].计算机工程,2005,13(31):192-194.[9]胡柯,颉谭成,董秀林.基于TCP/IP和Socket的网络文件传送[J].河南科技大学学报(自然科学版),2003,24(4):53-54.[10]周坤,傅德胜.基于WindowsSocket的网络数据传输及其安全[J].计算机工程与设计,2007,22(28):5381-5386.[11]Richard.Stevens.Bill.Fenner.Andrew.Rudoff.Unix.NetworkProgramming[J].NewScientist,2002,37(2):27-36.[12]谭翀.基于Socket的跨平台多服务器通信系统的设计与现[J].舰船电子工程,2009,8(182):101-104.[13]凌泽军,魏文娟,孙震强.智能终端的主流平台-WindowsMobile分析[J].中国电信股份有限公司北京研究院《移动通信》,2010,9(3):78-81. 附录程序源代码//TCPClientDlg.cpp:实现文件//#include"stdafx.h"#include"TCPClient.h"#include"TCPClientDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#endif//CTCPClientDlg对话框CTCPClientDlg::CTCPClientDlg(CWnd*pParent/*=NULL*/):CDialog(CTCPClientDlg::IDD,pParent){//{{AFX_DATA_INIT(CTCPClientDlg)m_remoteHost=_T("");m_remotePort=0;m_recvData=_T("");m_sendData=_T("");//}}AFX_DATA_INITm_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCTCPClientDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTCPClientDlg)DDX_Text(pDX,IDC_EDTREMOTEHOST,m_remoteHost);DDX_Text(pDX,IDC_EDTREMOTEPORT,m_remotePort);DDX_Text(pDX,IDC_EDTRECV,m_recvData);DDX_Text(pDX,IDC_EDTSENDDATA,m_sendData);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CTCPClientDlg,CDialog)#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP)ON_WM_SIZE()#endif//}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BTNCONN,&CTCPClientDlg::OnBnClickedBtnconn)ON_BN_CLICKED(IDC_BTNDISCONN,&CTCPClientDlg::OnBnClickedBtndisconn)ON_BN_CLICKED(IDC_BTNSENDDATA,&CTCPClientDlg::OnBnClickedBtnsenddata)END_MESSAGE_MAP()//CTCPClientDlg消息处理程序BOOLCTCPClientDlg::OnInitDialog(){m_bFullScreen=FALSE;CDialog::OnInitDialog();//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码CenterWindow(GetDesktopWindow());//centertothehpcscreen//初始化输入值m_remoteHost=GetLocalIP();m_remotePort=5000;UpdateData(FALSE);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}//连接断开事件voidCALLBACKCTCPClientDlg::OnDisConnect(CWnd*pWnd){CTCPClientDlg*pDlg=(CTCPClientDlg*)pWnd;CStatic*pStatus=(CStatic*)pDlg->GetDlgItem(IDC_LBLCONNSTATUS);ASSERT(pStatus!=NULL);pStatus->SetWindowText(_T("连接断开"));/*设置按钮可用属性*/CButton*pBtnConn=(CButton*)pDlg->GetDlgItem(IDC_BTNCONN);CButton*pBtnDisConn=(CButton*)pDlg->GetDlgItem(IDC_BTNDISCONN);CButton*pBtnSendData=(CButton*)pDlg->GetDlgItem(IDC_BTNSENDDATA);ASSERT(pBtnConn!=NULL); ASSERT(pBtnDisConn!=NULL);ASSERT(pBtnSendData!=NULL);pBtnConn->EnableWindow(TRUE);pBtnDisConn->EnableWindow(FALSE);pBtnSendData->EnableWindow(FALSE);}//数据接收事件voidCALLBACKCTCPClientDlg::OnRead(CWnd*pWnd,constchar*buf,intlen){CTCPClientDlg*pDlg=(CTCPClientDlg*)pWnd;CEdit*pEdtRecv=(CEdit*)pDlg->GetDlgItem(IDC_EDTRECV);ASSERT(pEdtRecv!=NULL);CStringstrRecv=CString(buf);//将接收的数据显示到接收文本框上pEdtRecv->SetWindowText(strRecv);}//Socket错误事件voidCALLBACKCTCPClientDlg::OnError(CWnd*pWnd,intnErrorCode){AfxMessageBox(_T("客户端socket发生错误"));}#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP)voidCTCPClientDlg::OnSize(UINT/*nType*/,int/*cx*/,int/*cy*/){if(AfxIsDRAEnabled()){DRA::RelayoutDialog(AfxGetResourceHandle(),this->m_hWnd,DRA::GetDisplayMode()!=DRA::Portrait?MAKEINTRESOURCE(IDD_TCPCLIENT_DIALOG_WIDE):MAKEINTRESOURCE(IDD_TCPCLIENT_DIALOG));}}#endifvoidCTCPClientDlg::OnBnClickedBtnconn(){//TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);//设置m_tcpClient属性m_tcpClient.m_remoteHost=m_remoteHost;m_tcpClient.m_port=m_remotePort;m_tcpClient.OnDisConnect=OnDisConnect;m_tcpClient.OnRead=OnRead;m_tcpClient.OnError=OnError;//打开客户端socketm_tcpClient.Open(this);//建立与服务器端连接if(m_tcpClient.Connect()){CStatic*pStatus=(CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);ASSERT(pStatus!=NULL);pStatus->SetWindowText(L"建立连接");UpdateData(FALSE);}else{AfxMessageBox(_T("建立连接失败"));CStatic*pStatus=(CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);ASSERT(pStatus!=NULL);pStatus->SetWindowText(L"连接断开");return;}/*设置按钮可用属性*/CButton*pBtnConn=(CButton*)GetDlgItem(IDC_BTNCONN);CButton*pBtnDisConn=(CButton*)GetDlgItem(IDC_BTNDISCONN);CButton*pBtnSendData=(CButton*)GetDlgItem(IDC_BTNSENDDATA);ASSERT(pBtnConn!=NULL);ASSERT(pBtnDisConn!=NULL);ASSERT(pBtnSendData!=NULL);pBtnConn->EnableWindow(FALSE);pBtnDisConn->EnableWindow(TRUE);pBtnSendData->EnableWindow(TRUE);}voidCTCPClientDlg::OnBnClickedBtndisconn(){//TODO:Addyourcontrolnotificationhandlercodehereif(m_tcpClient.Close()){CStatic*pStatus=(CStatic*)GetDlgItem(IDC_LBLCONNSTATUS); ASSERT(pStatus!=NULL);pStatus->SetWindowText(L"连接断开");CButton*pBtnConn=(CButton*)GetDlgItem(IDC_BTNCONN);CButton*pBtnDisConn=(CButton*)GetDlgItem(IDC_BTNDISCONN);CButton*pBtnSendData=(CButton*)GetDlgItem(IDC_BTNSENDDATA);ASSERT(pBtnConn!=NULL);ASSERT(pBtnDisConn!=NULL);ASSERT(pBtnSendData!=NULL);pBtnConn->EnableWindow(TRUE);pBtnDisConn->EnableWindow(FALSE);pBtnSendData->EnableWindow(FALSE);}else{AfxMessageBox(_T("连接断开失败"));}}voidCTCPClientDlg::OnBnClickedBtnsenddata(){//TODO:Addyourcontrolnotificationhandlercodeherechar*sendBuf;intsendLen=0;UpdateData(TRUE);sendLen=m_sendData.GetLength();sendBuf=newchar[sendLen*2];wcstombs(sendBuf,m_sendData,sendLen);if(!m_tcpClient.SendData(sendBuf,sendLen)){AfxMessageBox(_T("发送失败"));}delete[]sendBuf;sendBuf=NULL;}//得到本地的IP地址CStringCTCPClientDlg::GetLocalIP(){HOSTENT*LocalAddress;char*Buff;TCHAR*wBuff;CStringstrReturn=_T(""); //创建新的缓冲区Buff=newchar[256];wBuff=newTCHAR[256];//置空缓冲区memset(Buff,'',256);memset(wBuff,TEXT(''),256*sizeof(TCHAR));//得到本地计算机名if(gethostname(Buff,256)==0){//转换成双字节字符串mbstowcs(wBuff,Buff,256);//得到本地地址LocalAddress=gethostbyname(Buff);//置空buffmemset(Buff,'',256);//组合本地IP地址sprintf(Buff,"%d.%d.%d.%d",LocalAddress->h_addr_list[0][0]&0xFF,LocalAddress->h_addr_list[0][1]&0x00FF,LocalAddress->h_addr_list[0][2]&0x0000FF,LocalAddress->h_addr_list[0][3]&0x000000FF);//置空wBuffmemset(wBuff,TEXT(''),256*sizeof(TCHAR));//转换成双字节字符串mbstowcs(wBuff,Buff,256);//设置返回值strReturn=wBuff;}else{}//释放Buff缓冲区delete[]Buff;//释放wBuff缓冲区delete[]wBuff;returnstrReturn;}//TCPClient_CE.h:interfacefortheCTCPClient_CEclass.////////////////////////////////////////////////////////////////////////#if!defined(AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9BA3_96152245C65E__INCLUDED_)#defineAFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9BA3_96152245C65E__INCLUDED_ #if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#include//定义连接断开事件typedefvoid(CALLBACK*ONDISCONNECT)(CWnd*);//定义当有数据接收事件typedefvoid(CALLBACK*ONREAD)(CWnd*,constchar*buf,intlen);//定义Socket错误事件typedefvoid(CALLBACK*ONERROR)(CWnd*,intnErrorCode);classCTCPClient_CE{public:CTCPClient_CE();virtual~CTCPClient_CE();public://打开客户端socketboolOpen(CWnd*pWnd);//关闭客户端socketboolClose();//与服务器端建立连接boolConnect();//向服务器端发送数据boolSendData(constchar*buf,intlen);public://远程主机IP地址CStringm_remoteHost;//远程主机端口intm_port;/*--以下客户端通讯事件--*///连接断开事件,回调函数ONDISCONNECTOnDisConnect;//接收数据事件,回调函数ONREADOnRead;//发生错误事件,回调函数ONERROROnError;private://通讯Socket句柄 SOCKETm_socket;//通讯线程退出事件句柄HANDLEm_exitThreadEvent;//通讯线程句柄HANDLEm_tcpThreadHandle;//父窗口句柄CWnd*m_pOwnerWnd;private://通讯线程函数staticDWORDSocketThreadFunc(LPVOIDlparam);};#endif//!defined(AFX_TCPCLIENT_CE_H__B7856B99_69E7_4868_9BA3_96152245C65E__INCLUDED_)//TCPClient.h:PROJECT_NAME应用程序的主头文件//#pragmaonce#ifndef__AFXWIN_H__#error"在包含此文件之前包含“stdafx.h”以生成PCH文件"#endif#ifdefPOCKETPC2003_UI_MODEL#include"resourceppc.h"#endif//CTCPClientApp://有关此类的实现,请参阅TCPClient.cpp//classCTCPClientApp:publicCWinApp{public:CTCPClientApp();//重写public:virtualBOOLInitInstance();//实现DECLARE_MESSAGE_MAP()}; externCTCPClientApptheApp;//{{NO_DEPENDENCIES}}//MicrosoftVisualC++generatedincludefile.//UsedbyTCPClientppc.rc//#defineIDD_TCPCLIENT_DIALOG102#defineIDD_TCPCLIENT_DIALOG_WIDE103#defineIDP_SOCKETS_INIT_FAILED103#defineIDR_MAINFRAME128#defineIDC_STATIC_1200#defineIDC_EDTREMOTEHOST1000#defineIDC_EDTREMOTEPORT1001#defineIDC_BTNCONN1002#defineIDC_BTNDISCONN1003#defineIDC_BTNSENDDATA1004#defineIDC_EDTSENDDATA1005#defineIDC_EDTRECV1006#defineIDC_LBLCONNSTATUS1007//Nextdefaultvaluesfornewobjects//#ifdefAPSTUDIO_INVOKED#ifndefAPSTUDIO_READONLY_SYMBOLS#define_APS_NEXT_RESOURCE_VALUE129#define_APS_NEXT_COMMAND_VALUE32771#define_APS_NEXT_CONTROL_VALUE1008#define_APS_NEXT_SYMED_VALUE101#endif#endifstdafx.h:标准系统包含文件的包含文件,//或是经常使用但不常更改的//特定于项目的包含文件#pragmaonce#pragmacomment(linker,"/nodefaultlib:libc.lib")#pragmacomment(linker,"/nodefaultlib:libcd.lib")//注意-这个值与作为目标的WindowsCEOS版本的关联性并不强#defineWINVER_WIN32_WCE#ifndefVC_EXTRALEAN#defineVC_EXTRALEAN//从Windows头中排除极少使用的资料#endif #define_ATL_CSTRING_EXPLICIT_CONSTRUCTORS//某些CString构造函数将是显式的#ifdef_CE_DCOM#define_ATL_APARTMENT_THREADED#endif//关闭MFC对某些常见但经常可放心忽略的警告消息的隐藏#define_AFX_ALL_WARNINGS#include#ifdefined(WIN32_PLATFORM_PSPC)||defined(WIN32_PLATFORM_WFSP)#defineSHELL_AYGSHELL#endif#include//MFC核心组件和标准组件#include//MFC扩展#ifndef_AFX_NO_OLE_SUPPORT#include//MFC对InternetExplorer4公共控件的支持#endif#ifndef_AFX_NO_AFXCMN_SUPPORT#include//MFC对Windows公共控件的支持#endif//_AFX_NO_AFXCMN_SUPPORT#include//MFC套接字扩展#ifdefined(WIN32_PLATFORM_PSPC)||defined(WIN32_PLATFORM_WFSP)#ifndef_DEVICE_RESOLUTION_AWARE#define_DEVICE_RESOLUTION_AWARE#endif#endif#ifdef_DEVICE_RESOLUTION_AWARE#include"DeviceResolutionAware.h"#endif#ifdefSHELL_AYGSHELL#include#pragmacomment(lib,"aygshell.lib")#endif//SHELL_AYGSHELL #if(_WIN32_WCE<0x500)&&(defined(WIN32_PLATFORM_PSPC)||defined(WIN32_PLATFORM_WFSP))#pragmacomment(lib,"ccrtrtti.lib")#ifdef_X86_#ifdefined(_DEBUG)#pragmacomment(lib,"libcmtx86d.lib")#else#pragmacomment(lib,"libcmtx86.lib")#endif#endif#endif#include//TCPClientDlg.cpp:实现文件//#include"stdafx.h"#include"TCPClient.h"#include"TCPClientDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#endif//CTCPClientDlg对话框CTCPClientDlg::CTCPClientDlg(CWnd*pParent/*=NULL*/):CDialog(CTCPClientDlg::IDD,pParent){//{{AFX_DATA_INIT(CTCPClientDlg)m_remoteHost=_T("");m_remotePort=0;m_recvData=_T("");m_sendData=_T("");//}}AFX_DATA_INITm_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCTCPClientDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTCPClientDlg)DDX_Text(pDX,IDC_EDTREMOTEHOST,m_remoteHost);DDX_Text(pDX,IDC_EDTREMOTEPORT,m_remotePort); DDX_Text(pDX,IDC_EDTRECV,m_recvData);DDX_Text(pDX,IDC_EDTSENDDATA,m_sendData);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CTCPClientDlg,CDialog)#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP)ON_WM_SIZE()#endif//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BTNCONN,&CTCPClientDlg::OnBnClickedBtnconn)ON_BN_CLICKED(IDC_BTNDISCONN,&CTCPClientDlg::OnBnClickedBtndisconn)ON_BN_CLICKED(IDC_BTNSENDDATA,&CTCPClientDlg::OnBnClickedBtnsenddata)END_MESSAGE_MAP()//CTCPClientDlg消息处理程序BOOLCTCPClientDlg::OnInitDialog(){m_bFullScreen=FALSE;CDialog::OnInitDialog();//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码CenterWindow(GetDesktopWindow());//centertothehpcscreen//初始化输入值m_remoteHost=GetLocalIP();m_remotePort=5000;UpdateData(FALSE);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}//连接断开事件voidCALLBACKCTCPClientDlg::OnDisConnect(CWnd*pWnd){CTCPClientDlg*pDlg=(CTCPClientDlg*)pWnd; CStatic*pStatus=(CStatic*)pDlg->GetDlgItem(IDC_LBLCONNSTATUS);ASSERT(pStatus!=NULL);pStatus->SetWindowText(_T("连接断开"));/*设置按钮可用属性*/CButton*pBtnConn=(CButton*)pDlg->GetDlgItem(IDC_BTNCONN);CButton*pBtnDisConn=(CButton*)pDlg->GetDlgItem(IDC_BTNDISCONN);CButton*pBtnSendData=(CButton*)pDlg->GetDlgItem(IDC_BTNSENDDATA);ASSERT(pBtnConn!=NULL);ASSERT(pBtnDisConn!=NULL);ASSERT(pBtnSendData!=NULL);pBtnConn->EnableWindow(TRUE);pBtnDisConn->EnableWindow(FALSE);pBtnSendData->EnableWindow(FALSE);}//数据接收事件voidCALLBACKCTCPClientDlg::OnRead(CWnd*pWnd,constchar*buf,intlen){CTCPClientDlg*pDlg=(CTCPClientDlg*)pWnd;CEdit*pEdtRecv=(CEdit*)pDlg->GetDlgItem(IDC_EDTRECV);ASSERT(pEdtRecv!=NULL);CStringstrRecv=CString(buf);//将接收的数据显示到接收文本框上pEdtRecv->SetWindowText(strRecv);}//Socket错误事件voidCALLBACKCTCPClientDlg::OnError(CWnd*pWnd,intnErrorCode){AfxMessageBox(_T("客户端socket发生错误"));}#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP)voidCTCPClientDlg::OnSize(UINT/*nType*/,int/*cx*/,int/*cy*/){if(AfxIsDRAEnabled()){DRA::RelayoutDialog(AfxGetResourceHandle(),this->m_hWnd,DRA::GetDisplayMode()!=DRA::Portrait? MAKEINTRESOURCE(IDD_TCPCLIENT_DIALOG_WIDE):MAKEINTRESOURCE(IDD_TCPCLIENT_DIALOG));}}#endifvoidCTCPClientDlg::OnBnClickedBtnconn(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);//设置m_tcpClient属性m_tcpClient.m_remoteHost=m_remoteHost;m_tcpClient.m_port=m_remotePort;m_tcpClient.OnDisConnect=OnDisConnect;m_tcpClient.OnRead=OnRead;m_tcpClient.OnError=OnError;//打开客户端socketm_tcpClient.Open(this);//建立与服务器端连接if(m_tcpClient.Connect()){CStatic*pStatus=(CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);ASSERT(pStatus!=NULL);pStatus->SetWindowText(L"建立连接");UpdateData(FALSE);}else{AfxMessageBox(_T("建立连接失败"));CStatic*pStatus=(CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);ASSERT(pStatus!=NULL);pStatus->SetWindowText(L"连接断开");return;}/*设置按钮可用属性*/CButton*pBtnConn=(CButton*)GetDlgItem(IDC_BTNCONN);CButton*pBtnDisConn=(CButton*)GetDlgItem(IDC_BTNDISCONN);CButton*pBtnSendData=(CButton*)GetDlgItem(IDC_BTNSENDDATA);ASSERT(pBtnConn!=NULL);ASSERT(pBtnDisConn!=NULL);ASSERT(pBtnSendData!=NULL);pBtnConn->EnableWindow(FALSE); pBtnDisConn->EnableWindow(TRUE);pBtnSendData->EnableWindow(TRUE);}voidCTCPClientDlg::OnBnClickedBtndisconn(){//TODO:Addyourcontrolnotificationhandlercodehereif(m_tcpClient.Close()){CStatic*pStatus=(CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);ASSERT(pStatus!=NULL);pStatus->SetWindowText(L"连接断开");CButton*pBtnConn=(CButton*)GetDlgItem(IDC_BTNCONN);CButton*pBtnDisConn=(CButton*)GetDlgItem(IDC_BTNDISCONN);CButton*pBtnSendData=(CButton*)GetDlgItem(IDC_BTNSENDDATA);ASSERT(pBtnConn!=NULL);ASSERT(pBtnDisConn!=NULL);ASSERT(pBtnSendData!=NULL);pBtnConn->EnableWindow(TRUE);pBtnDisConn->EnableWindow(FALSE);pBtnSendData->EnableWindow(FALSE);}else{AfxMessageBox(_T("连接断开失败"));}}voidCTCPClientDlg::OnBnClickedBtnsenddata(){//TODO:Addyourcontrolnotificationhandlercodeherechar*sendBuf;intsendLen=0;UpdateData(TRUE);sendLen=m_sendData.GetLength();sendBuf=newchar[sendLen*2];wcstombs(sendBuf,m_sendData,sendLen);if(!m_tcpClient.SendData(sendBuf,sendLen)){AfxMessageBox(_T("发送失败"));}delete[]sendBuf;sendBuf=NULL; }//得到本地的IP地址CStringCTCPClientDlg::GetLocalIP(){HOSTENT*LocalAddress;char*Buff;TCHAR*wBuff;CStringstrReturn=_T("");//创建新的缓冲区Buff=newchar[256];wBuff=newTCHAR[256];//置空缓冲区memset(Buff,'',256);memset(wBuff,TEXT(''),256*sizeof(TCHAR));//得到本地计算机名if(gethostname(Buff,256)==0){//转换成双字节字符串mbstowcs(wBuff,Buff,256);//得到本地地址LocalAddress=gethostbyname(Buff);//置空buffmemset(Buff,'',256);//组合本地IP地址sprintf(Buff,"%d.%d.%d.%d",LocalAddress->h_addr_list[0][0]&0xFF,LocalAddress->h_addr_list[0][1]&0x00FF,LocalAddress->h_addr_list[0][2]&0x0000FF,LocalAddress->h_addr_list[0][3]&0x000000FF);//置空wBuffmemset(wBuff,TEXT(''),256*sizeof(TCHAR));//转换成双字节字符串mbstowcs(wBuff,Buff,256);//设置返回值strReturn=wBuff;}else{}//释放Buff缓冲区delete[]Buff; //释放wBuff缓冲区delete[]wBuff;returnstrReturn;}//TCPServerDlg.cpp:实现文件//#include"stdafx.h"#include"TCPServer.h"#include"TCPServerDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#endif//CTCPServerDlg对话框CTCPServerDlg::CTCPServerDlg(CWnd*pParent/*=NULL*/):CDialog(CTCPServerDlg::IDD,pParent),m_localPort(0){m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCTCPServerDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);DDX_Text(pDX,IDC_EDTLOCALPORT,m_localPort);}BEGIN_MESSAGE_MAP(CTCPServerDlg,CDialog)#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP) ON_WM_SIZE()#endif//}}AFX_MSG_MAPON_BN_CLICKED(IDC_BTNLISTEN,&CTCPServerDlg::OnBnClickedBtnlisten)ON_BN_CLICKED(IDC_BTNCLOSE,&CTCPServerDlg::OnBnClickedBtnclose)ON_LBN_SELCHANGE(IDC_LSTCONN,&CTCPServerDlg::OnLbnSelchangeLstconn)ON_EN_CHANGE(IDC_EDTLOCALPORT,&CTCPServerDlg::OnEnChangeEdtlocalport)ON_LBN_SELCHANGE(IDC_LSTRECV,&CTCPServerDlg::OnLbnSelchangeLstrecv)END_MESSAGE_MAP()//CTCPServerDlg消息处理程序BOOLCTCPServerDlg::OnInitDialog(){CDialog::OnInitDialog();//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码//设置默认值m_localPort=5000;UpdateData(FALSE);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP)voidCTCPServerDlg::OnSize(UINT/*nType*/,int/*cx*/,int/*cy*/){if(AfxIsDRAEnabled()){DRA::RelayoutDialog(AfxGetResourceHandle(),this->m_hWnd,DRA::GetDisplayMode()!=DRA::Portrait?MAKEINTRESOURCE(IDD_TCPSERVER_DIALOG_WIDE):MAKEINTRESOURCE(IDD_TCPSERVER_DIALOG));}}#endif //客户端连接建立事件处理函数voidCALLBACKCTCPServerDlg::OnClientConnect(CWnd*pWnd,CTCPCustom_CE*pTcpCustom){CTCPServerDlg*pDlg=(CTCPServerDlg*)pWnd;CListBox*pLstConn=(CListBox*)pDlg->GetDlgItem(IDC_LSTCONN);ASSERT(pLstConn!=NULL);pLstConn->AddString(pTcpCustom->m_RemoteHost+_T("建立连接"));}//客户端SOCKET关闭事件处理函数voidCALLBACKCTCPServerDlg::OnClientClose(CWnd*pWnd,CTCPCustom_CE*pTcpCustom){CTCPServerDlg*pDlg=(CTCPServerDlg*)pWnd;intiIndex=0;CListBox*pLstConn=(CListBox*)pDlg->GetDlgItem(IDC_LSTCONN);ASSERT(pLstConn!=NULL);iIndex=pLstConn->FindString(iIndex,pTcpCustom->m_RemoteHost+_T("建立连接"));if(iIndex==LB_ERR){return;}pLstConn->DeleteString(iIndex);}//服务器端收到来自客户端的数据voidCALLBACKCTCPServerDlg::OnClientRead(CWnd*pWnd,CTCPCustom_CE*pTcpCustom,constchar*buf,intlen){CStringstrRecv;CStringstrLen;strLen.Format(L"%d",len);strRecv=buf;CTCPServerDlg*pDlg=(CTCPServerDlg*)pWnd;CListBox*pLstRecv=(CListBox*)pDlg->GetDlgItem(IDC_LSTRECV);ASSERT(pLstRecv!=NULL);pLstRecv->AddString(_T("************************************"));pLstRecv->AddString(_T("来自:")+pTcpCustom->m_RemoteHost);pLstRecv->AddString(_T("数据长度:")+strLen);pLstRecv->AddString(strRecv);if(!pTcpCustom->SendData("recvok",strlen("recvok"))){AfxMessageBox(_T("发送失败")); }}//客户端Socket错误事件处理函数voidCALLBACKCTCPServerDlg::OnClientError(CWnd*pWnd,CTCPCustom_CE*pTcpCustom,intnErrorCode){}//服务器端Socket错误事件处理函数voidCALLBACKCTCPServerDlg::OnServerError(CWnd*pWnd,CTCPServer_CE*pTcpServer_CE,intnErrorCode){}voidCTCPServerDlg::OnBnClickedBtnlisten(){//TODO:AddyourcontrolnotificationhandlercodehereUpdateData(TRUE);//设置m_tcpServer属性m_tcpServer.m_LocalPort=m_localPort;m_tcpServer.m_pOwnerWnd=this;m_tcpServer.OnClientConnect=OnClientConnect;m_tcpServer.OnClientClose=OnClientClose;m_tcpServer.OnClientRead=OnClientRead;m_tcpServer.OnClientError=OnClientError;m_tcpServer.OnServerError=OnServerError;if(m_tcpServer.Open()<=0){AfxMessageBox(_T("监听失败"));return;}CButton*pBtnListen=(CButton*)GetDlgItem(IDC_BTNLISTEN);ASSERT(pBtnListen!=NULL);pBtnListen->EnableWindow(FALSE);CButton*pBtnClose=(CButton*)GetDlgItem(IDC_BTNCLOSE);ASSERT(pBtnClose!=NULL);pBtnClose->EnableWindow(TRUE);}voidCTCPServerDlg::OnBnClickedBtnclose(){//TODO:Addyourcontrolnotificationhandlercodehere if(m_tcpServer.Close()<=0){AfxMessageBox(_T("关闭TCP服务器失败"));return;}CButton*pBtnListen=(CButton*)GetDlgItem(IDC_BTNLISTEN);ASSERT(pBtnListen!=NULL);pBtnListen->EnableWindow(TRUE);CButton*pBtnClose=(CButton*)GetDlgItem(IDC_BTNCLOSE);ASSERT(pBtnClose!=NULL);pBtnClose->EnableWindow(FALSE);CListBox*pLstConn=(CListBox*)GetDlgItem(IDC_LSTCONN);ASSERT(pLstConn!=NULL);CListBox*pLstRecv=(CListBox*)GetDlgItem(IDC_LSTRECV);ASSERT(pLstRecv!=NULL);pLstConn->ResetContent();pLstRecv->ResetContent();}voidCTCPServerDlg::OnLbnSelchangeLstconn(){//TODO:Addyourcontrolnotificationhandlercodehere}voidCTCPServerDlg::OnEnChangeEdtlocalport(){//TODO:IfthisisaRICHEDITcontrol,thecontrolwillnot//sendthisnotificationunlessyouoverridetheCDialog::OnInitDialog()//functionandcallCRichEditCtrl().SetEventMask()//withtheENM_CHANGEflagORedintothemask.//TODO:Addyourcontrolnotificationhandlercodehere}voidCTCPServerDlg::OnLbnSelchangeLstrecv(){//TODO:Addyourcontrolnotificationhandlercodehere}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭