基于winsock的网络按时计费系统设计与实现论文学士学位论文.doc
《基于winsock的网络按时计费系统设计与实现论文学士学位论文.doc》由会员分享,可在线阅读,更多相关《基于winsock的网络按时计费系统设计与实现论文学士学位论文.doc(32页珍藏版)》请在咨信网上搜索。
毕业论文(设计) 基于Winsock的网络按时计费系统设计与实现 学生姓名: 学 号: 系 别: 信息工程学院 专 业:计算机应用技术 指导教师:_____ 评阅教师: 论文答辩日期 答辩委员会主席 摘要 随着计算机网络技术的发展,计算机网络已经深入到社会的各个领域。人们对网络的收费方式要求也越来越高!本文建立了一种基于Winsock控制的网络按时计费系统模型,介绍在Internet平台下Winsock网络编程接口的原理,采用TCP/IP协议,设计并实现一个运行在局域网环境之上,集当前流行的客户机∕服务器模式、先进的Winsock通信编程技术为一体的网络按时计费系统。经实际运用,证明本系统设计合理、界面友好、操作简便、功能全面。解决了人们节省开销的问题同时也提高了网络流量。 关键词:网络,winsock,TCP/IP协议,客户机∕服务器,计费管理系统 Abstract With the development of computer network technology, computer network has depth in all areas of society. Charge of the network approach requires more and more high! In this paper, a network based on the Winsock control systems on time and billing model, introduced in the Internet platform for network programming under the Winsock interface principle, the use of TCP / IP protocol, design and realization of a run on the LAN environment, set the current popular client / server mode, advanced programming techniques Winsock communications network for the whole time and billing system. By practical application, designed to prove the system, user-friendly, easy to operate, full-featured. Solve the problem of people save money but also improve the network traffic. Keywords:Network,Winsock,TCP/IP protocol,Client/Server mode,Accounting Management System 目 录 摘要 Ⅰ Abstract Ⅱ 目 录 4 1 绪言 6 1.1 课题背景 6 1.2 课题研究的目的和意义 6 1.3 国内外概况 7 1.4 课题的主要研究工作 7 2 系统设计方案的研究 8 2.1 系统的特点与性能要求 8 2.2 系统基本方案 9 2.2.1 Winsock的工作原理 9 2.2.2 方案 10 3 系统的软件设计 12 3.1 软件系统的概述 12 3.2 程序的设计 12 3.2.1 服务器的设计 12 3.2.2 客户机的设计 16 3.2.3 部分源代码 17 3.2.4 程序设计时应注意的 18 4 基于TCP/IP协议的网络编程 20 4.1 TCP/IP 体系结构与特点 20 4.1.1 TCP/IP体系结构 20 4.1.2 TCP/IP特点 20 4.2 协议简介 21 4.3 专用术语 21 4.4 Winsock的基本概念 21 4.5 常用Winsock函数 22 4.6 基本套接字 25 5 系统测试 27 5.1 测试仪器 27 5.2 软件调试 27 5.3测试结果分析与结论 27 6 总结和展望 28 致谢 29 参考文献 30 1 绪言 1.1 课题背景 在80年代初,美国加利福尼亚大学伯克利分校的研究人员为TCP/IP网络通信开发了一个专门用于网络通讯开发的API。这个API就是Socket接口(套接字)--当今在TCP/IP网络最为通用的一种API,也是在互联网上进行应用开发最为通用的一种API。在微软联合其它几家公司共同制定了一套Windows下的网络编程接口Windows Sockets规范后,由于在其规范中引入了一些异步函数,增加了对网络事件异步选择机制,因此更加符合Windows的消息驱动特性,使网络开发人员可以更加方便的进行高性能网络通讯程序的设计【1】。利用Winsock网络编程设计各种应用软硬件已经非常的实用。 Winsock是一个ActiveX控件,它为采用客户机/服务器通信机制的网络提供了编制接口,使客户机端和服务器端藉此实现连接和数据交换。Winsock允许实用两种通道:一种是传输控制协议(TCP),另一种是用户报文协议(UDP),TCP通信方式提供了一种面向连接的高可靠传输,而UDP通信方式提供了一种无连接的不可靠的传输。本文使用的是TCP通信方式。Winsock的工作原理是:客户端向服务器端发出连接请求,服务器定时地监听网路上有无来自客户端的请求,当双方的协议符合时,双方之间就建立了连接,之后就可以用Winsock控件固有的一些属性、方法进行通信和数据交换了【2】。 Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。现在的Winsock已经基本上实现了与协议无关,你可以使用Winsock来调用多种协议的功能,但较常使用的是TCP/IP协议。Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。 1.2 课题研究的目的和意义 目前,随着宽带网络的普及,越来越多的用户可以体验到高速上网的乐趣,但是在宽带运营中存在一个问题:宽带一般采用的是包月计费的方式,但是用户的需求是多样的,会有按时计费的需求,这就需要采用网络计费系统。现实中存在“按时长计费”和“按流量计费”两种计费模式,“按时长计费”的缺点是在上网的高峰时段,由于网络拥塞而导致的垃圾等待时长不应该算在用户的帐单上!“按流量计费”的缺点是如果电脑误中病毒,向其它电脑发送数据包产生的垃圾流量不应该让用户埋单!就目前国内宽带市场现状,并借鉴国外运营商的相关经验,认为在用户的消费行为偏爱、消费感知和运营商的系统支撑等诸多方面,按流量计费模式都尚不成熟,“按时长收费”的模式仍是首选【3】。 研究此课题是为了利用Winsock的编程实现这一系统,从而使按时收费系统更加适合现代人,也减少了资源的浪费。更进一步的说明利用Winsock可以更加方便的进行高性能网络通讯程序的设计。 1.3 国内外概况 电脑和网络的普及改变了社会的现代化步伐,使之发生日新月异的变化,也在全方位地改变着人们的生活。如今,人们的生活越来越离不开网络,网络俨然成为人们日常生活的一部分,如电子商务、电子邮件、自动化办公、信息搜寻等等。同时,网络也成为人们休闲娱乐的主要工具,像在线游戏、媒体播放、到虚拟社区“灌水”等等。 虽然中国的网络风风雨雨地走过了五年,网民队伍也从0迅速扩大到了2千多万,但严格来讲,中国的网络还没有真正渗透到产业的内部,没有从根本上对传统生产力与生产关系形成根本的触动。即以我国目前信息化的进程看,动辄几十亿、上百亿的投资在短期内还不可能迅速转化为生产价值。一个没有为社会创造一定价值的东西,却要社会负担起它成长的成本,这在市场经济的规则下似乎显得有些难为情。 仔细分析一下网民的构成,我们很容易发现,青年学生和IT从业人员构成了网民的主体(CNNIC的调查也证明了这一点)【4】。换言之,中国的网民,还不是一个具有消费能力的群体。从这个程度上看,中国的网民更像是网络学校的学生。要一个没有消费能力的群体去支撑网站们的发展,遭到反对是必然的现象。 “从目前的情况看,按流量收费明显是比计时收费贵,那么除了经济原因,还有什么原因(尤其是技术原因)促使大外要按流量收取网络使用费?”这是我在某一论坛中看到的,这反映了我国的科技并不是很发达!而Winsock编程的出现解决了这一问题【5】。 目前网络费用是根据用户所使用的流量来计算的和根据时间计费的,按时长计费”的缺点是在上网的高峰时段,由于网络拥塞而导致的垃圾等待时长不应该算在用户的帐单上!“按流量计费”的缺点是如果电脑误中病毒,向其它电脑发送数据包产生的垃圾流量不应该让用户埋单! 在80年代初,美国加利福尼亚大学伯克利分校的研究人员为TCP/IP网络通信开发了一个专门用于网络通讯开发的API,这个API就是Socket接口。Windows Sockets规范后,由于在其规范中引入了一些异步函数,增加了对网络事件异步选择机制,因此更加符合Windows的消息驱动特性,使网络开发人员可以更加方便的进行高性能网络通讯程序的设计。利用Winsock网络编程设计各种应用软硬件已经非常的实用。在将来Winsock编程会应用到网络的各个领域! 1.4 课题的主要研究工作 研究Winsock的工作原理、编程方法,TCP/IP协议下计算机的工作原理,基于TCP/IP协议的网 络编程,服务器端与客户机端程序的设计等,通过解决这些问题来实现Winsock网络按时收费系统的设计。 2 系统设计方案的研究 2.1 系统的特点与性能要求 我们所设计的网络计费系统分为三部分,一是在win32平台上的线程对数据包的截获,并且进行初步的整理,生成日志文件,并加适当的控制,这是低层的服务程序,作为前台;而后台则是在windows net server上的数据库管理,用Borland Delphi 4.0开发,直接取得第一部分截取程序生成的日志文件和通过ftp获取在Linux服务器上其它服务生成的日志文件,对其分析,统计出有效的数据信息,并至于以BDE驱动的数据库文件中。三是计费信息用户查询子系统,使得用户能在线通过权限查询到自己各个时间段内的计费信息和费用情况,有利于减轻网络管理员的工作负担【6】。 首选Windows Socket API进行套接字编程。整个系统分为两部分:服务端和客户端。 Windows Sockets 是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets 的基础上,又进行了新的扩充。这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。 windows Sockets由两部分组成:开发组件和运行组件。 开发组件:Windows Sockets 实现文档、应用程序接口(API)引入库和一些头文件。 运行组件:Windows Sockets 应用程序接口的动态链接库(WINSOCK.DLL)。 主要扩充说明 1、异步选择机制: Windows Sockets 的异步选择函数提供了消息机制的网络事件选择,当使用它登记网络事件发生时,应用程序相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。 Windows Sockets 提供了一个异步选择函数 WSAAsyncSelect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口函数将收到一个消息。 函数结构如下: int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent); 参数说明: hWnd:窗口句柄 wMsg:需要发送的消息 lEvent:事件(以下为事件的内容) FD_READ 期望在套接字上收到数据(即读准备好)时接到通知 FD_WRITE 期望在套接字上可发送数据(即写准备好)时接到通知 FD_OOB 期望在套接字上有带外数据到达时接到通知 FD_ACCEPT 期望在套接字上有外来连接时接到通知 FD_CONNECT 期望在套接字连接建立完成时接到通知 FD_CLOSE 期望在套接字关闭时接到通知【7】 2.2 系统基本方案 2.2.1 Winsock的工作原理 Socket是BSD UNIX 提供的基于TCP/IP网络应用编程的接口,采用客户—服务器的通讯机制,使网络客户和服务器方通过Socket实现网络之间的连接和数据交换。Socket提供了一系列调用,使用这些系统调用可以实现TCP,UDP,ICMP和IP等多种网络协议之间的通讯。 Socket有3种主要类型:流式套接口,数据报套接口和原始套接口。流式套接口定义了一种连接的服务,实现了无差错无重复的顺序数据传输,通过内置的流量控制解决了数据的拥塞,应用程序可以发送任意长度的数据,将数据当作字节流。数据报套接口定义了一种无连接的服务,数据通过相互独立的包进行传输,包的传输是无序的,并且不保证是否出错、丢失和重复【8】。包长度是有限的(隐含长度为8192字节,最大长度可设为32768字节)。原始套接口允许对低层协议如IP和ICMP的直接存取,它主要用于写低层的通信软件和协议等。 面向连接服务器处理的请求往往比较复杂,原理是:服务器端不断监听客户端的请求,当客户端向服务器端发出连接请求并被服务器端检测到以后,服务器会接收客户端的请求,并建立连接。连接的建立可以确保文件传输的正确性,连接建立之后,双方就可以相互发送和接受数据了。使用面向连接的套接口编程,可以通过图1来表示。从图1中可以看出,客户和服务器的关不是对称的。服务器首先启动,然后在某一时间启动客户机与服务器建立连接。服务器和客户机开机都必须调用sock()建立一个套接字(socket),然后服务器调用bind(),将套接字与1个本地网络地址捆扎在一起,再调用listen(),使套接字处于一种被动的准备状态,同时规定它的请求队列长度,之后服务器就可以调用accept()来接收连接了【9】。客户在建立套接字之后,便可以提供调用connect()和服务器建立连接。连接建立后,客户和服务器之间就可以通过连接发送和接收数据(调用read()和write()).最后,待数据传送结束,双方调用close()关闭套接字。 Socket () Bind () Socket () Listen () Accept () Connect () Close () Write () Read () Close () Read () Write () 建立连接 请求数据 应答数据 阻塞、等待客户数据 处理服务请求 图1 应用程序之间的接口关系 2.2.2 方案 本文在方案选择上采用了在网络编程中最常用的一种模型--客户机/服务器模型。这种客户/服务器模型是一种非对称式编程模式。该模式的基本思想是把集中在一起的应用划分成为功能不同的两个部分,分别在不同的计算机上运行,通过它们之间的分工合作来实现一个完整的功能。对于这种模式而言其中一部分需要作为服务器,用来响应并为客户提供固定的服务;另一部分则作为客户机程序用来向服务器提出请求或要求某种服务。 本文选取了基于TCP/IP的客户机/服务器模型和面向连接的流式套接字。其通信原理为:服务器端和客户端都必须建立通信套接字,而且服务器端应先进入监听状态,然后客户端套接字发出连接请求,服务器端收到请求后,建立另一个套接字进行通信,原来负责监听的套接字仍进行监听,如果有其它客户发来连接请求,则再建立一个套接字。默认状态下最多可同时接收5个客户的连接请求,并与之建立通信关系【10】。因此本程序的设计流程应当由服务器首先启动,然后在某一时刻启动客户机并使其与服务器建立连接。服务器与客户机开始都必须调用Windows Sockets API函数socket()建立一个套接字sockets,然后服务器方调用bind()将套接字与一个本地网络地址捆扎在一起,再调用listen()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长度。在此之后服务器就可以通过调用accept()来接收客户机的连接。 相对于服务器,客户端的工作就显得比较简单了,当客户端打开套接字之后,便可通过调用connect()和服务器建立连接。连接建立之后,客户和服务器之间就可以通过连接发送和接收资料。最后资料传送结束,双方调用closesocket()关闭套接字来结束这次通讯。 3 系统的软件设计 3.1 软件系统的概述 Windows环境下进行WINSOCK开发,可以使用的编程语言有很多,常用的如VC++,JAVA,VB等。本文以VC++为例,来说明如何进行WINSOCK程序设计。根据前面设计的程序流程,可将程序划分为两部分:服务器端和客户端。而且整个实现过程可以大致用以下几个非常关键的Windows Sockets API函数将其惯穿下来【11】。 3.2 程序的设计 程序下面给出了一个完整的基于客户机/服务器模型的WINSOCK应用程序的实例。这个例子共包括两个程序,其中SERVER.CPP实现了服务器功能,CLIENT.CPP实现了客户机的功能。 3.2.1 服务器的设计 1)在初始化阶段调用WSAStartup() 此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。在程式中调用该函数的形式如下:WSAStartup((WORD)((1<<8|1),(LPWSADATA)&WSAData),其中(1<<8|1)表示我们用的是WinSocket1.1版本,WSAata用来存储系统传回的关于WinSocket的资料。 2)建立Socket 初始化WinSock的动态连接库后,需要在服务器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所使用的通信协议。此函数调用成功返回Socket对象,失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket 的函数都可以使用这个函数来获取失败的原因)【12】。 SOCKET PASCAL FAR socket( int af, int type, int protocol ) 参数: af:目前只提供 PF_INET(AF_INET); type:Socket 的类型 (SOCK_STREAM、SOCK_DGRAM); protocol:通讯协定(如果使用者不指定则设为0); 如果要建立的是遵从TCP/IP协议的socket,第二个参数type应为SOCK_STREAM。如为UDP(数据报)的socket,应为SOCK_DGRAM。 3)绑定端口 接下来要为服务器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。 int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name,int namelen ); 参 数: s:Socket对象名; name:Socket的地址值,这个地址必须是执行这个程式所在机器的IP地址; namelen:name的长度; 如果使用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,Windows Sockets 会自动将其设定适当之地址及Port (1024 到 5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值【13】。 4)监听 当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。listen()函数使服务器端的Socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5, 最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。 int PASCAL FAR listen( SOCKET s, int backlog ); 参 数: s:需要建立监听的Socket; backlog:最大连接个数; 服务器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server 端必须再调用accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回SOCKET_ERROR。 int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent ); 参数: s:Socket 对象; hWnd :接收消息的窗口句柄; wMsg:传给窗口的消息; lEvent:被注册的网络事件,也即是应用程序向窗口发送消息的网路事件,该值为下列值FD_READ、FD_WRITE、FD_OOB、FD_ACCEPT、FD_CONNECT、FD_CLOSE的组合,各个值的具体含意为FD_READ:希望在套接字S收到数据时收到消息;FD_WRITE:希望在套接字S上可以发送数据时收到消息;FD_ACCEPT:希望在套接字S上收到连接请求时收到消息;FD_CONNECT:希望在套接字S上连接成功时收到消息;FD_CLOSE:希望在套接字S上连接关闭时收到消息;FD_OOB:希望在套接字S上收到带外数据时收到消息【14】。 具体应用时,wMsg应是在应用程序中定义的消息名称,而消息结构中的lParam则为以上各种网络事件名称。所以,可以在窗口处理自定义消息函数中使用以下结构来响应Socket的不同事件: switch(lParam) {case FD_READ: … break; case FD_WRITE、 … break; … } 5)服务器端接受客户端的连接请求 当Client提出连接请求时,Server 端hwnd视窗会收到Winsock Stack送来我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件【15】。为了使服务器端接受客户端的连接请求,就要使用accept() 函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。 SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen ); 参数:s:Socket的识别码; addr:存放来连接的客户端的地址; addrlen:addr的长度 6)结束 socket 连接 结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,只要调用closesocket()就可以了,而要关闭Server端监听状态的socket,同样也是利用此函数。另外,与程序启动时调用WSAStartup()憨数相对应,程式结束前,需要调用 WSACleanup() 来通知Winsock Stack释放Socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。 int PASCAL FAR closesocket( SOCKET s ); 参 数:s:Socket 的识别码; int PASCAL FAR WSACleanup( void ); 参 数: 无 socket()->bind()->listen->accept()->recv()/send()->closesocket() 客户机方: socket()->connect()->send()/recv()->closesocket() 有鉴于以上几个函数在整个网络编程中的重要性,有必要结合程序实例对其做较深入的剖析。服务器端应用程序在使用套接字之前,首先必须拥有一个Socket,系统调用socket()函数向应用程序提供创建套接字的手段。该套接字实际上是在计算机中提供了一个通信埠,可以通过这个埠与任何一个具有套接字接口的计算机通信【16】。应用程序在网络上传输、接收的信息都通过这个套接字接口来实现的。在应用开发中如同使用文件句柄一样,可以对套接字句柄进行读写操作: sock=socket(AF_INET,SOCK_STREAM,0); 函数的第一个参数用于指定地址族,在Windows下仅支持AF_INET(TCP/IP地址);第二个参数用于描述套接字的类型,对于流式套接字提供有SOCK_STREAM;最后一个参数指定套接字使用的协议,一般为0。该函数的返回值保存了新套接字的句柄,在程序退出前可以用 closesocket(sock);函数来将其释放。服务器方一旦获取了一个新的套接字后应通过bind()将该套接字与本机上的一个端口相关联: sockin.sin_family=AF_INET; sockin.sin_addr.s_addr=0; sockin.sin_port=htons(USERPORT); bind(sock,(LPSOCKADDR)&sockin,sizeof(sockin))); 该函数的第二个参数是一个指向包含有本机IP地址和端口信息的sockaddr_in结构类型的指针,其成员描述了本地端口号和本地主机地址,经过bind()将服务器进程在网络上标识出来。需要注意的是由于1024以内的埠号都是保留的埠号因此如无特别需要一般不能将sockin.sin_port的埠号设置为1024以内的值【17】。然后调用listen()函数开始侦听,再通过accept()调用等待接收连接以完成连接的建立: //连接请求队列长度为1,即只允许有一个请求,若有多个请求, //则出现错误,给出错误代码WSAECONNREFUSED。 listen(sock,1); //开启线程避免主程序的阻塞 AfxBeginThread(Server,NULL); …… UINT Server(LPVOID lpVoid) { …… int nLen=sizeof(SOCKADDR); pView->newskt=accept(pView->sock,(LPSOCKADDR)& pView->sockin,(LPINT)& nLen); …… WSAAsyncSelect(pView->newskt,pView->m_hWnd,WM_SOCKET_MSG,FD_READ|FD_CLOSE); return 1; } 这里之所以把accept()放到一个线程中去是因为在执行到该函数时如没有客户连接服务器的请求到来,服务器就会停在accept语句上等待连接请求的到来,这势必会引起程序的阻塞,虽然也可以通过设置套接字为非阻塞方式使在没有客户等待时可以使accept()函数调用立即返回,但这种轮询套接字的方式会使CPU处于忙等待方式,从而降低程序的运行效率大大浪费系统资源。考虑到这种情况,将套接字设置为阻塞工作方式,并为其单独开辟一个子线程,将其阻塞控制在子线程范围内而不会造成整个应用程序的阻塞。对于网络事件的响应显然要采取异步选择机制,只有采取这种方式才可以在由网络对方所引起的不可预知的网络事件发生时能马上在进程中做出及时的响应处理,而在没有网络事件到达时则可以处理其他事件,这种效率是很高的,而且完全符合Windows所标榜的消息触发原则。前面那段代码中的WSAAsyncSelect()函数便是实现网络事件异步选择的核心函数。 3.2.2 客户机的设计 1)建立客户端的Socket 客户端应用程序首先也是调用WSAStartup() 函数来与Winsock的动态连接库建立关系,然后同样调用socket() 来建立一个TCP或UDP socket(相同协定的 sockets 才能相通,TCP 对 TCP,UDP 对 UDP)。与服务器端的socket 不同的是,客户端的socket 可以调用 bind() 函数,由自己来指定IP地址及port号码;但是也可以不调用 bind(),而由 Winsock来自动设定IP地址及port号码。 2)提出连接申请 客户端的Socket使用connect()函数来提出与服务器端的Socket建立连接的申请,函数调用成功返回0,否则返回SOCKET_ERROR。 int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR *name, int namelen ); 参 数:s:Socket 的识别码; name:Socket想要连接的对方地址; namelen:name的长度 socket()->connect()->send()/recv()->closesocket() 通过第四个参数注册应用程序感兴取的网络事件,在这里通过FD_READ|FD_CLOSE指定了网络读和网络断开两种事件,当这种事件发生时变会发出由第三个参数指定的自定义消息WM_SOCKET_MSG,接收该消息的窗口通过第二个参数指定其句柄。在消息处理函数中可以通过对消息参数低字节进行判断而区别出发生的是何种网络事件: void CNetServerView::OnSocket(WPARAM wParam,LPARAM lParam) { int iReadLen=0; int message=lParam & 0x0000FFFF; switch(message) { case FD_READ://读事件发生。此时有字符到达,需要进行接收处理 char cDataBuffer[MTU*10]; //通过套接字接收信息 iReadLen = recv(newskt,cDataBuffer,MTU*10,0); //将信息保存到文件 if(!file.Open("ServerFile.txt",CFile::modeReadWrite)) file.Open("E:ServerFile.txt",CFile::modeCreate|CFile::modeReadWrite); file.SeekToEnd(); file.Write(cDataBuffer,iReadLen); file.Close(); break; case FD_CLOSE://网络断开事件发生。此时客户机关闭或退出。 ……//进行相应的处理 break; default: break; } } 在这里需要实现对自定义消息WM_SOCKET_MSG的响应,需要在头文件和实现文件中分别添加其消息映射关系: 头文件: //{{AFX_MSG(CNetServerView) //}}AFX_MSG void OnSocket(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() 实现文件: BEGIN_MESSAGE_MAP(CNetServerView, CView) //{{AFX_MSG_MAP(CNetServerView) //}}AFX_MSG_MAP ON_MESSAGE(WM_SOCKET_MSG,OnSocket) END_MESSAGE_MAP() 3.2.3 部分源代码 Connectdb()//本地数据库进行连接 Local port=”3350”//定义连接端口 Local_ip=getipaddress()//得到本地ip地址 Ocx_communicate.objet.Bind(Local_port Local_ip)//进行通信绑定 Ocx_communicate.objet.Listen()//通信控件进行侦听 Connectionrequest事件编码//连接请求时处理 li_lrow=dw_message.insertrow(0) dw_message.setitem(li_lrow,”ms”,”连接请求,远程IP地址:+ ocx_communicate.object.Remote-HostIP”) if ocx_communicate.object.State<>0then ocx_communicate.object.close() end if ocx_communicate.object.Accept(requestid) remote_IP= ocx_communicate.object.Remote_HostIP li_lrow=dw_message.insertrow(0) dw_message.setitem(li_lrow,”ms”,”连接成功,远程IP地址:+ Remote-IP”)- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 winsock 网络 按时 计费 系统 设计 实现 论文 学士学位
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文