




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GPRS开发系列文章之入门篇 GPRS开发系列文章之入门篇要做GPRS方面的应用软件开发,除了必备的一些程序设计知识之外,对计算机网络通信这些专业术语的了解可是一个都不能少,本人并不是专职于移动开发,所以在搞开发时也遇到了很多困难。出于这种考虑,我也想写个GPRS开发系列入门文章,服务于各位还正在搜索资料的同仁们(开发者抑或PDA爱好者等都行),同时欢迎各位移动开发的高手指点,共同提高。接下来的文章依次为:GPRS开发系列文章之进阶篇(主要讲述evc/.NetCF下的开发类库)GPRS开发系列文章之实战篇(利用类库进行client和server端开发)注:第一次在首页发文章,挺紧张的,如果内容不适合,我将第一时间转到新手区去。本篇文章的大致路线是这样的,先介绍下一些具体概念,然后再解释下GPRS是如何工作的,这里并不涉及具体开发,主要了解业务逻辑。n 入门概念篇1. GSM。GSM全名为:Global System for Mobile Communications,中文为全球移动通讯系统,俗称全球通,是一种起源于欧洲的移动通信技术标准,它采用电话交换的技术,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。我国于20世纪90年代初引进采用此项技术标准,此前一直是采用蜂窝模拟移动技术,即第一代GSM技术(2001年12月31日我国关闭了模拟移动网络)。目前,中国移动、中国联通各拥有一个GSM网,为世界最大的移动通信网络。GSM系统包括 GSM 900:900MHz、GSM1800:1800MHz 及 GSM1900:1900MHz等几个频段 。GSM(全球移动通信系统)是一种广泛应用于欧洲及世界其他地方的数字移动电话系统。GSM使用的是时分多址的变体,并且它是目前三种数字无线电话技术(TDMA、GSM和CDMA)中使用最为广泛的一种。GSM将资料数字化,并将数据进行压缩,然后与其它的两个用户数据流一起从信道发送出去,另外的两个用户数据流都有各自的时隙。GSM实际上是欧洲的无线电话标准,据GSM MoU联合委员会报道,GSM在全球有120亿的用户,并且用户遍布120多个国家。因为许多GSM网络操作员与其他国外操作员有漫游协议,因此当用户到其他国家之后,仍然可以继续使用他们的移动电话。美国著名通信公司Sprint的一个辅助部门,美国个人通信正在使用GSM作为一种宽带个人通信服务的技术。这种个人通信服务将最终为爱立信、摩托罗拉以及诺基亚现在正在生产的手持机建立400多个基站。手持机包括电话、短信寻呼机和对讲机。GSM及其他技术是无线移动通信的演进,无线移动通信包括高速电路交换数据、通用无线分组系统、基于GSM网络的数据增强型移动通信技术以及通用移动通信服务2. GPRS。GPRS是通用分组无线业务(General Packet Radio Service)的简称,它突破了GSM网只能提供电路交换的思维方式,只通过增加相应的功能实体和对现有的基站系统进行部分改造来实现分组交换,这种改造的投入相对来说并不大,但得到的用户数据速率却相当可观。GPRS(General Packet Radio Service)是一种以全球手机系统(GSM)为基础的数据传输技术,可说是GSM的延续。GPRS和以往连续在频道传输的方式不同,是以封包(Packet)式来传输,因此使用者所负担的费用是以其传输资料单位计算,并非使用其整个频道,理论上较为便宜。GPRS的传输速率可提升至56甚至114Kbps。而且,因为不再需要现行无线应用所需要的中介转换器,所以连接及传输都会更方便容易。如此,使用者既可联机上网,参加视讯会议等互动传播,而且在同一个视讯网络上(VRN)的使用者,甚至可以无需通过拨号上网,而持续与网络连接。注意:GPRS并不是新一代的移动通信系统,GPRS只是一项加快数据传输的服务,在无线电波的传递上,还是以GSM的规格,所以可以说GPRS只是GSM的加强模型而并非新一代通信系统,也有人称之为2.5代通信系统3. 电路交换(Circuit Switching)是两计算机或终端相通信时,使用的同一条实际物理链路,在通信中自始自终使用该贯路传输,且不允许其他计算机或终端同时共亨该链路。电路交换包括公用电话网,公用电报网和电路交换的公用数据网(CSPDN);4. 分组交换网是继电路交换网和报文交换网之后一种新型交换网络,它主要用于数据通信。分组交换是一种存储转发的交换方式,它将用户的报文划分成一定长度的分组,以分组为存储转发,因此,它比电路交换的利用率高,比报文交换的时延要小,而具有实时通信的能力。分组交换利用统计时分复用原理,将一条数据链路复用成多个逻辑信道,最终构成一条主叫、被叫用户之间的信息传送通路,称之为虚电路(V.C)实现数据的分组传送。5. APN(Access Point Name),即接入点,在GPRS网络中引入了APN的概念,用户在激活网络时一般将APN作为参数,对应外部网络的业务提供者。对于一个GGSN(类似路由或网关),APN和业务提供者有着特定的对应关系。用户访问外部网络时,如果用户不指明具体的APN,网络侧将指配给用户一个缺省的APN,用户也可以自行指定具体的APN。6. GGSN(Gateway GSN,网关GSN)主要是起网关作用,它可以和多种不同的数据网络连接,如ISDN、PSPDN和LAN等。有的文献中,把GGSN称为GPRS路由器。GGSN可以把GSM网中的GPRS分组数据包进行协议转换,从而可以把这些分组数据包传送到远端的TCPIP或X.25网络。7. SGSN(Serving GPRS Support Node,服务GPRS支持节点)SGSN是GSM/GPRS/EDGE网络的CN(Core Network,核心网)的网元。它负责在其服务区内转发MS(Mobile Station,移动台)与外部网络之间的IP数据包。SGSN和MS之间的业务信息还要经过BSC(Base Staion Controller,基站控制器)和BTS(Base Transceiver Station,基站收发信台)的传输8. VPN(Virtual Private Network,虚拟专用网络) 虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。虚拟专用网是对企业内部网的扩展。9. CMNET与CMWAP (China Mobile Net与China Mobile Wap.) CMNET和CMWAP是中国移动GPRS网络的两个不同APN(Access Point Name接入点名称)。CMNET提供了NAT服务,使用该服务的手机可以直接访问internet。CMWAP只提供了WAP代理和HTTP代理,手机上网能访问的范围有限,接入时只能访问GPRS网络内的IP(72 )。因此CMWAP主要用于手机WAP上网,CMNET则是用于PC,笔记本电脑,PDA等设备实现GPRS上网。两者手机上网的方式没有差别,如此划分是中国移动对手机上网服务对象的定位不同,所以他们的应用范围和自费标准不同;10. 其他常见英文缩写:u BSC 基站控制器 Base Station Controlleru BSS 基站系统 Base Station Systemu BTS 基站收发系统 Base Transeiver Systemu CDMA1X 码分多址 Code Division Multiple Accessu DDN 数字数据网 Digital Data Networku DHCP 动态主机配置协议 Dynamic Host Configuration Protocolu DNS 域名系统 Domain Name Systemu ISDN 综合数字业务网络 Integrated Services Digital Networku ISP 互联网业务提供商 Internet Service Provideru M2M Machine to Machine 或Mobile to Machine业务u NAT 网络地址转换 Network Address Translationu RTU 远方终端单元 Remote Terminal Unitu SIM用户标识模块 Subscriber Identify Moduleu SMS短消息业务Short Message Serviceu TDMA 时分多址 Time Division Multiple Acessn GPRS连接Internet工作原理篇 GPRS技术将通信网络和计算机网络结合在一起,向全IP网络的方向发展。GPRS基站与SGSN设备之间的连接一般通过帧中继连接,GGSN与 SGSN设备之间通过IP网络连接。GGSN是GPRS网络的网关和路由器。GGSN可以把GSM网中的GPRS分组数据包进行协议转换,从而可以把这些分组数据包传送到远端的INTERNET或X.25网络. (简单表示如下) GGSN可以由具有网络地址翻译功能的路由器承担内部IP地址与外部网络IP地址的转换。用户可以访问GPRS内部的网络,也可以通过APN访问外部的INTERNET.如果用户的IP地址是运营商分配的公有地址,则GGSN不参与用户的论证和鉴权过程。用户可以通过GGSN透明地接入到GPRS内部网络或互联网络,这种方式称为透明方式. 非透明方式主要是用户通过GPRS网络接入到企业网络或ISP的情形。用户MS的IP地址是由企业网络或ISP分配的私有地址,用户访问该企业网络或ISP时,GGSN需要企业网络或ISP中的专用服务器对该用户进行鉴权或论证。 在标识GPRS设备中,如手机MS的标识除了在GSM中使用IMSI,MSISDN等号码外,还需要分配IP地址。网元设备SGSN,GGSN的标识既有7号信令地址,又有数据GGSN的IP地址,网元设备之间的通信采用IP地址,而网元设备与MSC、HLR等实体的通信采用信令地址。在GPRS系统中,有一个重要的数据库记录信息,即用户PDP上下文(分组数据协议上下文),用于管理从手机MS到网关GGSN 及到ISP之间的数据路由信息。当MS访问GPRS内部网络或外部INTERINT网络时,MS提出PDP上下文请求消息,MS可以与运营商签约选择固定服务的GGSN。或由SGSN选择服务的GGSN,SGSN再向GGSN发建立PDP上下文请求消息。GGSN分配MS一个IP地址。在成功地建立和激活PDP上下文后,MS,SGSN和 GGSN都存储了用户的PDP上下文信息。有了用户的位置信息和数据的路由信息,MS就可以访问该网络的资源。 用户通过GPRS网络接入到互联网、企业内部网或ISP时,需要对用户的身份、服务质量进行鉴权和数据加密等过程,用户MS的动态IP地址的分配可以分别由运营商、企业网或ISP等实现,因此GPRS用户的接入方式有透明接入和非透明接入两种方式n 附PDA开发机利用GPRS上网步骤(点击“开始”-“设置”“连接”)如果您的开发机支持GPRS,那么上网(Internet)可以有两种接入点(APN)方式供选择,一种是cmwap,一种是cmnet,他们的设置参数分别为:(其中步骤为)l CMWAP方式1)连接名称: 中国移动梦网(GPRS) 2)数据承载方式: GPRS 3)接入点名称: cmwap 4)用户名: 无 5)密码: 无6)鉴定: 普通 7)网关IP 地址: 72 8)主页: / 9)连接安全: 关10)连接类型: 永久11)可选端口:80/8080/9201 需要设置的主要参数: l CMNET 方式1)连接名称: 中国移动互联网(GPRS) 2)数据承载方式: GPRS 3)接入点名称: cmnet 4)用户名: 无 5)密码: 无 6)鉴定: 普通7)网关IP 地址: 无 8)连接安全: 关9)连接类型: 永久 注:本文除少数文字外,多数都来源于网络,本人只做了整理以供学习和比较之用。GPRS开发系列文章之进阶篇 GPRS开发系列文章之进阶篇相关文章:GPRS开发系列文章之入门篇 GPRS开发系列文章之实战篇 一、前言在前篇GPRS开发系列文章之入门篇里,我主要对GPRS开发中遇到的一些常用概念和一些业务逻辑做了简单的介绍,没想到得到了很多网友的支持和关注,因昨天有事因此延迟到今天才奉上这篇进阶系列文章,还请各位见谅。希望大家支持同时欢迎拍砖,共同提高。在最后一篇GPRS开发系列文章之实战篇我将详细叙述如何利用类库开发Client和Server端通信程序,因此本文的多数讲解将是为下文服务的。本文将向您介绍基于PPC2003的Windows mobile 系列的客户端和基于.Net 2005的服务器端进行开发所需掌握和了解的开发库,并着重围绕客户端进行GPRS连接所用到的一些API函数进行讲解。本文的最后是一些用于引用和学习用的链接和利用API建立GPRS连接的demo,感兴趣的同志可以去点击或下载后进行深入研究。 关于客户端API的叙述我基本上都是翻译过来的,如欠妥还请各位多多斧正!同时demo程序我也是只做了部分加工,主要都是参照了谢红伟的发表的文章(后面有引用链接)二、进阶系列篇详解1. 客户端建立GPRS连接 API客户端开发采用 EVC4.0进行开发,主要讲解的类库为Connection Manager 系列API,客户端在进行GPRS拨号连接时将使用下文所介绍的API。 Connection Manager(本人译为 连接管理器,此对象为一系列API的集合) 系列API的主要目的是为了集中管理基于Windows Mobile系列的设备网络连接的建立与维护。移动应用程序使用 连接管理器API去建立或规划一个网络连接,而连接管理器则掌控连接过程中的所有状态信息.应用程序在要发起一个连接(比如Internet),只要简单的告知连接管理器就OK了。当一个应用程序发起一个网络连接的请求时,连接管理器首先从连接服务提供商(CSPS)处获取所有可能的连接信息,然后连接管理器会从这一系列连接信息中根据开销,延迟、带宽等因素来选择一个最佳的连接,最后连接管理器将被请求的连接排入队列,然后在一个适合的时间使用CSPS来建立连接。【API函数】:a) ConnMgrApiReadyEvent()函数函数原型:HANDLE WINAPI ConnMgrApiReadyEvent();利用此函数来我们可以返回一个连接事件的句柄 ,注意在的得到句柄后要记得及时释放b) ConnMgrConnectionStatus()函数函数原型:HRESULT WINAPI ConnMgrConnectionStatus(HANDLE hConnection,DWORD * pdwStatus );利用此函数的返回值pdwStatus,我们可以得到很多的关于连接的信息,例如如果我们连接成功将返回CONNMGR_STATUS_CONNECTED,断开连接将返回CONNMGR_STATUS_DISCONNECTED,他的返回状态信息非常丰富,有14中之多,完全可以满足我们的应用需要;c) ConnMgrEnumDestinations()函数函数原型:HRESULT WINAPI ConnMgrEnumDestinations(int nIndex,CONNMGR_DESTINATION_INFO * pDestInfo );一般我们的PDA在连接GPRS时都有好几个连接,利用此函数我们可以枚举出所有可用的连接,然后再对挑选的连接进行筛选得到一个最佳连接接下来讲两个很重要的函数,我们将利用两个函数中的一个来发起连接,他们是:d) ConnMgrEstablishConnection()和ConnMgrEstablishConnectionSync()函数,这两个函数一个用于发起一个异步连接请求,一个用于同步请求,使用异步连接请求我们可以在发起连接后立即返回,而使用同步请求客户端将一直被阻塞知道函数返回确认连接,关于异步和同步我就不再叙述;它们的原型依次为:HRESULT WINAPI ConnMgrEstablishConnection( CONNMGR_CONNECTIONINFO * pConnInfo, HANDLE * phConnection );HRESULT WINAPI ConnMgrEstablishConnectionSync(CONNMGR_CONNECTIONINFO * pConnInfo, HANDLE * phConnection,DWORD dwTimeout, DWORD * pdwStatus );可以看到两个函数的第一个参数都为一个CONNMGR_CONNECTIONINFO对象,此对象为一个结构体,它保存了客户端发起连接请求的一系列信息,因此,在我们调用此函数时必须构造一个该对象,然后将其作为参数传入连接函数中。这里很有必要讲一下该结构体,该结构体的原型如下:typedef struct _CONNMGR_CONNECTIONINFO DWORD cbSize;DWORD dwParams;DWORD dwFlags;DWORD dwPriority;BOOL bExclusive;BOOL bDisabled;GUID guidDestNet;HWND hWnd;UINT uMsg;LPARAM lParam;ULONG ulMaxCost;ULONG ulMinRcvBw;ULONG ulMaxConnLatency; CONNMGR_CONNECTIONINFO;其中参数dwFlags用于指定我们的接入点,比如我们常说的CMNER和CMWAP,而参数GUID则标志了我们对应于每个接入点的全球唯一标志符,关于如何得到或者查看GUID,我们可以在“Program FilesWindows CE Toolswce420POCKET PC 2003IncludeArmv4”目录下查看connmgr.h文件,里面包含了各个接入点的GUID,例如:CMNET 为:(0x436ef144, 0xb4fb, 0x4863, 0xa0, 0x41, 0x8f, 0x90, 0x5a, 0x62, 0xc5, 0x72) CMWAP为:0x7022e968, 0x5a97, 0x4051, 0xbc, 0x1c, 0xc5, 0x78, 0xe2, 0xfb, 0xa5, 0xd9如果想更进一步了解,我们还可以通过查看注册表方式来查看PDA上连接管理器的相关连接信息,在PPC 2003中注册表路径为:HKEY_LOCAL_MACHINECommConnMgr,如下图所示:在Destinations一项中就对应我们所有可用的网络连接,这个跟用ConnMgrEnumDestinations()方法得到的是一样的效果,在默认Internet设置中我们将看到CMNET的GUID,如下所示:在这里里面有DestId一项,就对应着我们久违的GUIDe) ConnMgrReleaseConnection函数我们在上一步中建立连接后我们将得到一个连接句柄,在重新开始一个新的连接或者断开连接都要调用此函数来释放掉之前创建的连接,它的原型为:HRESULT WINAPI ConnMgrReleaseConnection(HANDLE hConnection,BOOL bCache );【连接管理API大致使用步骤】:首先我们利用ConnMgrApiReadyEvent()函数来确认是否有可用连接,如果有可用连接我们则利用ConnMgrEnumDestinations()函数枚举所有可用连接,然后遍历所有连接调用我们的同步或异步连接方法ConnMgrEstablishConnectionSync()与ConnMgrEstablishConnection()来发起连接,一旦连接成功后我们就可以进行我们伟大的下一步了,就是和我们的服务器进行通信。【GPRS demo效果图】 【GPRSDemo介绍】GPRSDemo主要利用了上述的几个重要的API函数来获取当前可用连接,并自动选择一个最佳的连接途径,然后启用这个连接,在连接启动成功以后再用socket 进行网络连接,与公网服务器进行通信。首先检查是否有可用连接BOOLCConnectManager:GetConnMgrAvailable()HANDLEhConnMgr=ConnMgrApiReadyEvent();BOOLbAvailbale=FALSE;DWORDdwResult=:WaitForSingleObject(hConnMgr,2000);if(dwResult=WAIT_OBJECT_0)bAvailbale=TRUE;/关闭if(hConnMgr)CloseHandle(hConnMgr);returnbAvailbale; 然后枚举所有可用连接: voidCConnectManager:EnumNetIdentifier(OUTCStringArray&StrAry)CONNMGR_DESTINATION_INFOnetworkDestInfo=0;/得到网络列表for(DWORDdwEnumIndex=0;dwEnumIndex+)memset(&networkDestInfo,0,sizeof(CONNMGR_DESTINATION_INFO);if(ConnMgrEnumDestinations(dwEnumIndex,&networkDestInfo)=E_FAIL)break;StrAry.Add(networkDestInfo.szDescription);接下来找到“Internet”这个连接,可用远程URL映射的方式来完成,这样可以让系统自动选取一个最好的连接。 intCConnectManager:MapURLAndGUID(LPCTSTRlpszURL,OUTGUID&guidNetworkObject,OUTCString*pcsDesc/*=NULL*/)if(!lpszURL|lstrlen(lpszURL)1)returnFALSE;memset(&guidNetworkObject,0,sizeof(GUID);intnIndex=0;HRESULThResult=ConnMgrMapURL(lpszURL,&guidNetworkObject,(DWORD*)&nIndex);if(FAILED(hResult)nIndex=-1;DWORDdwLastError=GetLastError();AfxMessageBox(_T(Couldnotmaparequesttoanetworkidentifier);elseif(pcsDesc)CONNMGR_DESTINATION_INFODestInfo=0;if(SUCCEEDED(ConnMgrEnumDestinations(nIndex,&DestInfo)*pcsDesc=DestInfo.szDescription;returnnIndex;最后启用指定编号的连接并检查连接状态BOOLCConnectManager:EstablishConnection(DWORDdwIndex)/释放之前的连接ReleaseConnection();/得到正确的连接信息CONNMGR_DESTINATION_INFODestInfo=0;HRESULThResult=ConnMgrEnumDestinations(dwIndex,&DestInfo);BOOLbRet=FALSE;if(SUCCEEDED(hResult)/初始化连接结构CONNMGR_CONNECTIONINFOConnInfo;ZeroMemory(&ConnInfo,sizeof(ConnInfo);ConnInfo.cbSize=sizeof(ConnInfo);ConnInfo.dwParams=CONNMGR_PARAM_GUIDDESTNET;ConnInfo.dwFlags=CONNMGR_FLAG_PROXY_HTTP|CONNMGR_FLAG_PROXY_WAP|CONNMGR_FLAG_PROXY_SOCKS4|CONNMGR_FLAG_PROXY_SOCKS5;ConnInfo.dwPriority=CONNMGR_PRIORITY_USERINTERACTIVE;ConnInfo.guidDestNet=DestInfo.guid;ConnInfo.bExclusive=FALSE;ConnInfo.bDisabled=FALSE;DWORDdwStatus=0;hResult=ConnMgrEstablishConnectionSync(&ConnInfo,&m_hConnection,10*1000,&dwStatus);if(FAILED(hResult)m_hConnection=NULL;elsebRet=TRUE;returnbRet;检测连接状态BOOLCConnectManager:WaitForConnected(intnTimeoutSec,DWORD*pdwStatus/*=NULL*/)DWORDdwStartTime=GetTickCount();BOOLbRet=FALSE;while(GetTickCount()-dwStartTime(DWORD)nTimeoutSec*1000)if(m_hConnection)DWORDdwStatus=0;HRESULThr=ConnMgrConnectionStatus(m_hConnection,&dwStatus);if(pdwStatus)*pdwStatus=dwStatus;if(SUCCEEDED(hr)if(dwStatus=CONNMGR_STATUS_CONNECTED)bRet=TRUE;break;Sleep(100);returnbRet; 最后要记得释放连接voidCConnectManager:ReleaseConnection()if(m_hConnection)ConnMgrReleaseConnection(m_hConnection,FALSE);m_hConnection=NULL;2. 客户端与服务器端进行socket通信APIsocket通信相关开发API在Winsock2.h.文件中定义,因为SOCKET通信不是本文的重点但是又是必须要涉及的 a) WSAStartup函数。在应用程序进行Windows Sockets通信时,必须首先调用此函数来指定应用程序要加载的Windows Scoket版本等信息,应用程序结束前我们应该调用WSACleanup去释放掉所用的系统资源b) Connect 函数。此函数用来建立连接c) Select 函数。建立连接后,用来侦听是否有数据传输d) Send函数。用于给服务器发送消息3. 服务器端与客户端进行socket通信 服务器端主要涉及到的库为:System.Net,System.Net.Sockets,System.IO;System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。 System.IO 命名空间包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。需要了解的技术有:多线程,事件与委托,SOCKET通信等三、 引用(参考)文章地址1. /en-us/library/ms827527.aspx(MSDN移动开发中心);2. /cpp/w-p/ce/pocketpc/article.php/c7355/(PPC应用程序Internet连接);3. /document/viewdoc/?id=1803(如何建立GPRS连接)4. /china/msdn/library/NetFramework/netcompactframework/understandingnetcfFAQ.mspx?mfr=true(常见开发问题解答)5. PPC SDK参考(安装 ppc 2003 SDK后才有)6.GPRS Demo下载GPRS开发系列文章之实战篇 GPRS开发系列文章之实战篇相关文章:GPRS开发系列文章之入门篇 GPRS开发系列文章之进阶篇一、前言在前篇GPRS开发系列文章之进阶篇里,我主要详细讲解了客户端进行GPRS连接的常用API,并对GPRSdemo测试程序中的连接类ConnManager中的一些重要函数做了说明,最后稍微提及了下服务器端要用到的一些类库。今天,在这篇实战篇中,我将在理解前两篇的基础上,结合客户端与服务器端,向大家介绍这篇GPRS开发之实战篇,向大家演示如何利用GPRS开发一个客户端与服务器端互相通信的程序,主要介绍SOCKET编程的原理和SOCKET应用API,并在最后提供本实战篇的源代码下载。最后还是那句老话,欢迎指点,共同提高!二、实战系列篇详解1. 开发环境a) 客户端:EVC4;b) 服务器端:VS2005(C#);2. 运行环境a) 客户端:ppc 2003(winCE4.2) for mobile或以上版本;b) 服务器端:WINXP/SERVER 2003等3. 客户端和服务器端通信详解 本文章的主要目的是利用GPRS连接编写一个利用TCP协议进行通信的程序,而在上篇文章已解决了GPRS连接的问题,因此剩下的主要就是我们都比较熟悉的SOCKET编程了,由于客户端和服务器端进行SOCKET通信的原理相同,所以我将他们放到一起进行讲解,主要介绍SOCKET编程的一些原理及要点,然后贴出部分比较重要的代码供大家参考。 首先,介绍些要了解SOCKET编程的一些核心概念: 我们知道在这种通信程序中,一般客户端和服务器端是分开的(本机通信可以看作是一种特例),客户端一旦和服务器端建立连接成功后就可以透明的传输数据和接收数据了。那么我们的程序在建立了GPRS连接到Internet后是如何访问到我们指定的服务器的呢?通信过程又是怎么控制的呢?那么首先看第一个概念,进程通信。 进程通信:这里的进程通信包括两种情况,一种是同一机器的不同进程之间的通信,另一种是在同一网络中(不同网络通过路由进行连接还是可以看成同一网络)的不同机器的不同进程之间的通信。在同一台机器中的进程通信问题,由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如管道(pipe)、命名管道(named pipe)和信号量(semaphore)等。各个进程要进行通信首先要解决进程的标识问题,在同一机器中,可用process ID来唯一标识每个单独的进程,我们可以在任务管理器中进行查看,每个进行都有自己唯一的标志符。如果没有看到的,可以在任务管理器中点击“查看”,然后点击“选择列”,在出现的对话框中选中“PID(进程标志符)”这一栏,确定后我们就可以看到每个进程的PID了,。而在网络中的不同电脑要进行通信,首先要经过网络间的协议转换然后再寻址找到我们的目的机器,最后根据特定标志符找到特定的进程,于是我们的客户端进程就可以和服务器进程进行网间进程通信了,在这一过程中扮演着重要角色的就是TCP/IP协议 TCP/IP协议:TCP/IP是一个协议簇,它包括网络接口层,网络层、传输层和应用层,网络层中有负责因特网地址(IP地址)与底层网络地址之间进行转换的地址解析协议ARP和反向地址解析协议RARP。同时也包括对主机和网关进行差错报告、控制和进行请求/应答的IGMP协议和网络层的核心协议IP协议。在TCP/IP协议簇中的传输层中,提供了进程间的通信的TCP和UDP协议,这两个协议分别提供了了可靠的面向连接的传输服务和简单高效的无连接传输服务,我们最需要了解的就是传输层中的这两个协议。 IP地址:因特网的IP协议提供了一种整个互联网中通用的地址格式,并在同一管理下进行IP地址的分配并保证其唯一性,以确保每台因特网主机(路由器)对应一个IP地址。 端口:网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。按照OSI七层协议的描述,传输层与网络层在功能上的最大区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅仅是主机地址了,还包括可以描述进程的某种标识符。为此,TCP/IP协议提出了协议端口(protocol port,简称端口)的概念,用于标识通信的进程。 端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应进程所接收,相应进程发给传输层的数据都通过该端口输出。在TCP/IP协议的实现中,端口类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问之,如我们通过指定端口读取GPS信息等。 类似于文件描述符,每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。因此当我们通过指定的IP地址和端口号就可以找到唯一标志我们的进程了。 在了解了上述基础知识后,我们可以简单做个回顾,总结下整个连接的过程。本文介绍的客户端与服务器端通信是典型的C/S模式,客户端在请求服务器端提供特定服务后,服务器端接收请求并提供相应服务。在TCP/IP网络应用中,C/S模式中服务器端是采取主动的方式,首先启动,并根据请求提供相应服务。 服务器端: 1. 打开一通信通道并告知本地主机,它愿意在某一公认地址上接收客户请求; 2. 等待客户请求到达该端口; 3. 接收到服务请求,处理该请求并发送应答信号 4. 返回第二步,等待另一客户请求。 5. 关闭服务器 客户端: 1. 打开一通信通道,并连接到服务器所在主机的特定端口; 2. 向服务器发服务请求报文,等待并接收应答;继续提出请求. 3. 请求结束后关闭通信通道并终止。客户端主界面如图所示:【代码部分】客户端主要功能为建立服务器的连接,和服务器互相通信(发送数据和接收数据),其中用到的关键的核心类为CConnectionManager类和CTCPClient_CE类,而服务器端主要负责侦听同时也发送数据给客户端,用到的核心类为ConnectionManager,客户端和服务器利用socket通信步骤如下:第一步:实例化套接字。用WINSOCK API方式如下(客户端):boolCTCPClient_CE:Connect()structsockaddr_inaddr;interr;addr.sin_family=AF_INET;addr.sin_port=htons(m_port);/此处要将双字节转换成单字节charansiRemoteHost255;ZeroMemory(ansiRemoteHost,255);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南省洛阳市名校2026届九上化学期中综合测试试题含解析
- 2025四川凉山甘洛县人民医院临床医学和康复医学专业技术人员招聘4人备考考试题库附答案解析
- 2025西安市远东第二中学高中数学教师招聘考试模拟试题及答案解析
- 2025四川凉山州宁南县招募医疗卫生辅助岗人员4人备考考试题库附答案解析
- 2025-2030肉牛养殖散户退出机制与产业整合策略报告
- 2025-2030肉牛产业技术推广体系重构与农技服务创新研究
- 2025-2030羊肉行业产能过剩预警与去库存方案报告
- 2025-2030精神健康服务需求激增及数字化诊疗手段与保险支付创新报告
- 2025-2030第三代功率半导体器件可靠性测试标准与车规认证研究报告
- 2025年合肥市海顿学校教师招聘考试模拟试题及答案解析
- 卡西欧手表SGW-100(3157)中文说明书
- 南京尚勤新材料科技有限公司药用表面活性剂研发项目环评报告表
- 【核心素养目标】人教版《劳动教育》六上 劳动项目一 《使用洗衣机》 课件
- 医院培训课件:《输血相关法规及输血知识培训》
- 新苏教版小学科学六年级上册《制作汽水》课件
- 眼科操作并发症及处理
- 药理学教案资料
- 江苏省建筑与装饰工程计价定额(2014)电子表格版
- 零基础预算培训课件
- 可摘义齿修复工艺技术
- DB15-T 2241-2021 数据中心绿色分级评估规范
评论
0/150
提交评论