利用VC实现网络通信

2024-07-25

利用VC实现网络通信(精选7篇)

利用VC实现网络通信 第1篇

关键词:TCP/IP协议,套接字,网络编程,Winsock

为了实现C/S模型的网络编程,90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口[1],即Windows Sockets规范,它不是一种网络协议,而是一套开放的、支持多种协议的Windows下的网络编程接口。Socket(套接字)实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。现在Socket接口几乎是TCP/IP网络标准API,很多TCP/IP的网络应用程序都是基于Socket而编写的。

虽然现在有很多工具如Web浏览器、FTP程序可以在网络上传输数据和文件,但是通过Win Sock编程有更大的灵活性,并且不需关心网络连接细节。

1 Client/Server(客户机/服务器)模型

在网络编程中最常用的方案便是Client/Server(客户机/服务器)模型[2]。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户向这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。通信过程如图1所示。

2 套接字

套接字是网络计算机与应用程序之间发送和接收数据方式的一种抽象描述[1]。用来实现主机和主机通信的一个接口,完成主机间的通信操作。它位于协议之上,屏蔽了底层的协议,能够实现各种类型的通信操作。它是网络通信中应用程序对应的进程和网络协议之间的接口。网络应用程序调用Winsock API函数实现相互之间的通信,同时,Winsock利用下层的网络通信协议和操作系统实现实际的通信,如图2所示。

在网络中进行通信,至少需要一对套接字,其中一个运行于客户机端,称之为Client Socket[3];另一个运行于服务器端,称之为Server Socket。套接字主要有三个参数,分别为通信的目的IP地址,使用的传输层协议(TCP或UDP)和使用的端口。根据这些参数,应用层就可以和传输层通过socket接口,实现数据传输。

2.1 Windows Sockets的相关技术分析

2.1.1 Windows Sockets的版本

常用的Windows Sockets有两个版本:Win Sock 1.1网络编程接口和Win Sock2.2网络编程接口。Win Sock1.1由动态链接库WIN-SOCK.DLL支持,主要应用在Windows95中,Win Sock2.2由动态链接库WINSOCK32.DLL支持,主要应用在Windows98和Windows2000中。Win Sock2.2与低版本Win Sock1.1相比,主要对一些协议进行了扩充,如IPX、NETBIOS等,同时对Win Sock1.1的函数完成兼容。

2.1.2 阻塞与非阻塞

套接字具备两种模式[4]:阻塞和非阻塞模式。当套接字处于阻塞模式时调用高模式的函数时,需要消耗一定的时间来等待操作的完成,而当套接字处于非阻塞模式时,调用函数立即返回,但通常会出错。当一特定的Win Sock API函数指出一个错误发生时,需要获取对应的错误代码,根据Win Sock版本的不同,包含在不同的头文件中。

2.1.3 网络字节顺序

网络字节就是网络上描述整数或浮点数的字节发送顺序(哪个字节被先发出去,哪个字节后发出去)。网络字节通常先传递高字节,而再传递低字节。而主机字节就是计算机内存中存放的整数或浮点数的方式,字节在内存中低字节在前,高字节在后。为了数据的一致性,就要把本地的数据转换成网络使用的格式,然后发送出去,接收的时候要转换成主机方式才能使用。下面的API函数将从主机字节顺序向网络字节顺序的转换:

1)htonl():参数是主机字节顺序的一个4字节数,函数返回网络字节顺序的数。

2)WSAHtonl():参数是主机字节顺序的一个4字节数,函数返回网络字节顺序的数。

3)htons():参数是主机字节顺序的一个2字节数,函数返回网络字节顺序的数。

4)WSAHtons():参数是主机字节顺序的一个2字节数,函数返回网络字节顺序的数。

2.2 Win Sock技术特点

2.2.1 套接字的分类

套接字根据通信的性质可以分为三类,在设计网络应用程序时,根据不同的要求来选择相应的套接字,只有相同类型的套接字才能相互通信。

流套接字(SOCK_STREAM)。提供一个面向连接可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。

数据报式套接字(SOCK_DGRAM)。提供一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。

原始式套接字(SOCK_RAW)。该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备,一般不提供给普通用户。

2.2.2 异步选择机制

Windows Sockets的异步选择机制为套接字编程提供了一种网络事件驱动的程序设计方法[4]。通过异步选择函数WSAAsync Select(),可以为应用程序程序注册一个或多个感兴趣的网络事件,如读写事件、连接事件、接受请求事件等。用来注册异步消息的函数是WSAAsync Select函数,它请求Windows Sockets DLL在检测到套接字上发生的网络事件时,向窗口发送一个消息。它自动地设置套接字处于非阻塞工作方式,事件可以是一个或多个组合而成。

2.2.3 对错误的处理

错误的发现和处理对于应用程序是非常重要的,对Win Sock而言,经常会返回一下错误信息,最常见的是SOCKET_ERROR,它是一个值为-1的常量,这时可以用WSAGet Last Error函数来获得一段代码,该代码可以清楚地表明错误产生的原因和类型,该函数的原型为:

Int WSAGet Last Error(void);

2.3 套接字编程模型

2.3.1 面向连接的套接字编程模型

套接字编程分为面向连接的套接字和面向无连接套接字的两种编程模型。在面向连接的套接字模型中,服务器需要等待客户端向其提出的建立连接的申请,一旦接收到客户端的连接请求,服务器返回一个新的套接字描述符,通过该描述符调用数据传输函数可以与客户端进行数据的收发[5]。面向有连接的编程模型如图3所示。

2.3.2 面向无连接的套接字编程模型

面向无连接的编程模型相对比较简单。服务器和客户端没有明确的界限,而且是对等的关系。客户端之间首先创建一个数据报式套接字,并将其绑定到地址和端口上。客户端与服务端的数据交换通过sendto和recvfrom函数完成,在调用这两个函数时都指定对方的地址,而不用建立连接。最后,都需要调用closesocket关闭套接字。面向无连接的套接字编程模型如下图4所示。

3 Win Sock实现基于TCP的客户端/服务器通信

此实例的目的是验证面向连接的通信模型,通过C++编码实现程序间的网络通信。实例分成两个程序,服务器端程序和客户端程序。

1)服务器程序主要代码

2)客户端主要代码

(3)该实例是面向连接的TCP协议,因此套接字采用流套接字(SOCK_STREAM),服务器在与客户端建立连接成功后,接收客户端发来信息“Hello,How are you!”,接收成功后,向客户端发送“ok!”字符串。实现服务器与客户端的网络通信。

4 总结

随着Internet的发展,网络应用软件的开发需求与日俱增。各式各样的网络应用软件也催生着各种网络编程技术的进步。用套接字(Socket)来实现互联网上的进程通讯,从而实现各种网络应用功能,是开发网络应用程序的重要方法。对于分布于不同主机上的进程通信,Sockets无疑是一种理想的手段,通过它可以方便地交换数据。Winsock技术的出现极好地屏蔽了网络低层复杂的结构和协议,这使得基于Winsock的网络应用程序可以在不同类型的网络上运行。同时使Winsock成为网络编程的最流行技术,可以说,套接字是网络通信的基石。

参考文献

[1]延霞,谢斐.Visual C++网络编程技术[M].北京:中国水利水电出版社,2010:6-11.

[2]郑阿奇.Visual C++6.0应用案例教程[M].北京:电子工业出版社,2010:160-170.

[3]邹月,陈建兵.Socket网络编程与实现[J].电脑编程技巧与维护,2009,(8):10-12.

[4]陈孚.VC环境下基于C/S模式的网络考试系统研究与实现[J].电脑编程技巧与维护.2011,(12):59-60.

利用VC编程实现网络状态在线监测 第2篇

1 VC编程概述

VC是一种软件集成开发环境,它是由微软公司开发完成的,换个角度理解就是基于C++的一个开发平台。VC是基于Windows平台的一种C++编程环境,包括MFC、ATL、COM等,此外还具有Windows平台的特性。基于Windows下的VC编程需要掌握Windows的消息机制和回调(callback)函数的原理。MFC是需要理解文档视图类的结构、窗口类的结构、消息流向等的Win32API的包装类。COM是一个需要掌握其基本原理代码共享的二进制标准。除此之外,VC是一个主流的开发平台,它不属于语言。如果将C++视为工业标准,那VC则是遵循工业标准的前提下衍生出来的某种厂商标准的操作系统平台。VC是一种包括WIN API和MFC方式的在Windows平台下开发的VC应用程序,MFC是对传统的WIN API再次封装,其结构相比较简单,所以MFC的开发模式备效率优势更加明显。

2 VC编程网络在线监测功能的模块化

要实现类似MFC的网络状态在线监测和数据分析,就必不可少的需要借助VC相应的功能,例如强大的网络通信板块、多线程开发板块等。在监测软件的开发过程中,充分利用VC成熟的开发资源平台,开发建立有针对性的应用功能模块,做到开发效率和软件质量的双赢,其主要包括以下环节:(1)功能模块设计。MFC应用的实际上是TCP/IP协议组主要用在IP主机、路由器之间传递控制消息的一个子ICMP协议。Windows给予了ASMP.dll的支持,能够从VC中直接引用,但是不支持移植,另外无法控制网络信息的数据包。因此,在基于工程中包含adewfxsock.hfg库的前提下,借助VC技术能够直接针对套接字(socket)进行有效编程,勾选了一个和MFC程序一样发送32字节的数据信息,得到数据包大小和TTL值的回馈,编程过程及系统调用时序,如图1所示。(2)网络状态在线监测。首先,构建套接字符串,然后指定使用的ICMP协议。其次,发送air_ICMP数据包,初试化ECHORHHGEQUEST的types为9的响应请求指令,然后通过系统调用发送ICMPSD数据,并设置目标IP地址。(3)监测套接字符串网络在线状态,检测一个或多个套字符串的状态。(4)响应数据的识别,判断网络在线监测状态。最终,在回馈的数据当中包含了该次在线监测的结果。至此,同MFC方式一样,通过VC编程实现网络状态在线监测。

3 VC多线程编程网络状态在线监测

进程和线程都可以被看作操作系统的概念。通过应用程序执行实例的过程被称作进程,私有的虚拟地址空间、代码、数据和其他各种系统资源共同构成了每个进程,并且在运行模拟的过程中进程的终止会销毁创建的资源,使得进程终止时,所使用的系统资源获得释放或关闭。线程以一个执行单元的形式存在于进程内部。系统创建好进程后,同时也就启动了以函数地址形式执行的进程的主执行线程,并且,Windows系统也将接受来自主执行线程的指令。主执行线程的行为状态最终决定了进程的行为状态。每一个进程都需要一个由系统自动创建的而不需要用户操作的线程。用户可以根据网络监测具体项目,来创建对应的程序在同一个进程中所需要的多个线程。网络状态在线监测模块,在不需要用户界面交互的条件下,能够自动获取所需要的目标IP地址数据,并通过该地址数据创建单独的线程,定时实现后台运行在线网络状态监测。线程之间的通讯之所以方便,是因为在一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,最终使得多线程技术的应用广泛流行。除此之外,为了减少某项任务的长时间占用CPU,多线程可以通过并行处理的方式来实现此功能。可以通过适当的人机交互界面和配置数据管理的方式,来搭建一个完整的VC编程控制的网络在线监测应用系统。该系统系统功能包括网络监测完成网络节点通阻状态的存储;状态显示完成网络节点通阻状态的监测;节点管理完成网络节点通阻状态的分析;指标分析完成网络节点通阻状态的显示。网络状态在线状态的显示是通过客户端图形模式和动态网页模式构成。客户端图形模式采用的是可以对系统监测周期和节点属性等参数进行配置的C/S架构,除此之外,该构架还可以查看节点监测通阻状态和大数据的整理与分析,最终得到故障原因及解决方案。而浏览器网页模式主要用于查看节点状态和指标分析数据。

4 结束语

基于VC编程充分利用了MFC总线的多节点、远距离、实时性好等优点,设计出了一套高效实用的网络在线监测系统,而且该系统具有直观实用的界面和高效简便的编程方式,在监测系统的应用很广泛。

参考文献

[1]赵立群,吴霞,孙岩.计算机网络管理与安全[M].北京:清华大学出版社,2014.

[2]罗莉琴,詹祖桥,黄辉等.Windows网络编程[M].北京:人民邮电出版社,2011.

[3]潘磊,裴斐.一种面向大规模网络拓扑发现的研究[J].计算机工程与应用,2010,46(19).

[4]DAVID.VISUAL C++6编程宝典[M].北京:电子工业出版社,2005.

利用VC实现网络通信 第3篇

在工控自动化的界面程序设计和游戏程序设计中,图像的运动是其中不可缺少的一种功能。图像的运动不但可以给人呈现出一种清晰、直观、有趣的视觉效果,重要的是在工控中能够实时地显示采集的数据。图像的运动所表现出来的效果虽然种类繁多,复杂多变,但究其原理却是基于一些基本的实现图像运动的方法,在这些方法之上,用户根据自己的需要加以扩展和改变就可以实现复杂的动画和动态曲线。

选择用VC来实现图像的运动是因为C语言是一种有着优良传统的程序开发语言,VC在程序开发上有着相对较强的优势,尤其对于讲求速度与性能的程序。因为VC的运行速度快,C++编译后的文件是可直接运行的机器代码,不需要中间代码而且C语言可以用指针直接存取系统上的内存,C语言也提供了许多有关内存处理的函数。但是其他语言如VB或Java,编译后产生的是中间码,运行时,系统必须存在解释这种中间码的解释码,用作同步翻译。在翻译过程中,本身会加载到内存中,且同步翻译中间码的过程中也会浪费时间,因此,运行这类程序要比可直接执行的程序慢得多。其次,VC里拥有一套完整而且庞大的MFC类库函数,使得程序员可以很轻易地构建出应用程序框架,简化了程序的开发难度。在VC里使用API也比较容易,只要在程序中加入要使用的函数的库就可以使用了。除了这些外,VC还可以结合DirectX、OpenGL来开发2D、3D效果。

2 实现方法

VC中实现图像运动的基本方法有两种。一种是通过位图的不断更替显示而出现动态;另一种是通过不断地重新绘制而出现动态。不论哪一种方法都需要一个定时器,甚至多个,用于定时启动位图的更替或画面的重新绘制。定时器可以每隔一段时间就发出时间消息,当接收到这个消息程序就可以决定接下来做什么。

2.1 定时器

2.1.1 SetTimer定时器

VC中最常用的定时器就是SetTimer函数,它每隔一段时间就向WM_TIMER发出消息,然后在WM_TIMER的消息处理函数OnTimer中进行下一步处理。SetTimer函数原型为:UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALL-BACK EXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD))。其中:第一个参数是计数器编号,这个号码是唯一的,在同一个窗口中可以设置多个不同编号的定时器;第二个参数是定时器发出消息的时间间隔,单位为毫秒;第三个参数是设定定时器发出消息时所要执行的回调函数。如果不使用回调函数,设置为NULL。一旦设定了定时器,就不停地按设置的时间间隔发送消息。若要停止某个定时器,必须使用停止函数:BOOL KillTimer(int nIDEvent)。nIDEvent就是要停止的定时器编号。但是由于Windows的定时器是建立在DOS的1CH的中断基础上的,而此中断的响应频率是每秒18.2次,所以Timer组件对小于55ms的计时器就无能为力了。此外,WM_TIMER消息没被处理时,定时器又触发了新的WM_TIMER消息就会被舍弃。因此只能适用于那些对时间要求不是很严格的场合。这时就可以使用多媒体定时器,它可以提供最小1ms的周期。

2.1.2 多媒体定时器

与多媒体定时器的相关函数有:TimeSetEvent()创建一个定时器事件;TimeKillEvent()取消一个定时器事件;TimeBeginPeriod()建立最小的定时器精度;TimeEndPeriod()消除所设置的定时器精度;TimeGetDevCaps()返回有关定时器性能信息。timeSetEvent的函数原型为:MMRESULT timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,WORD dwUser,UINT fuEvent)。uDelay:以毫秒指定事件的周期;Uresolution:以毫秒指定延时的精度数值越小定时器事件分辨率越高,缺省值为1ms;LpTimeProc:指向一个回调函数;DwUser:存放用户提供的回调数据;FuEvent:指定定时器事件类型;TIME_ONESHOT:uDelay毫秒后只产生一次事件;TIME_PERIODIC:每隔uDelay毫秒周期性地产生事件。但是,多媒体定时器也并不是完美的。因为它的精度是建立在对系统资源的消耗之上的。因此,在利用多媒体定时器完成工作的同时,必须注意以下几点:(1)多媒体定时器的设置分辨率不能超出系统许可范围。(2)在使用完定时器以后,一定要及时删除定时器及其分辨率,否则系统会越来越慢。(3)多媒体定时器在启动时,将自动开辟一个独立的线程。在定时器线程结束之前,注意一定不能再次启动该定时器,不然将迅速造成死机。

2.2 位图

有了定时器之后,就可以在消息处理函数中添加代码,进行贴图或者绘图。如果是贴图就需要用到LoadImage()和BitBlt()函数。LoadImage用于加载位图,函数原型为:HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT u Type,int x Desired,int cyDesired,UINT fuLoad)。其中:hinst为包含位图所在的实体;lpszName为要加载位图所在的路径与文件名或资源名称;uType为加载位图的类型;x Desired为加载位图的宽度;cy Desired为加载位图的高度;fuLoad为设定位图的加载方式。BitBlt()用于将内存DC中的内容贴到要显示的DC,这样就可以显示位图了,函数原型为:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int n Height,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop)。其中:hdcDest为目标设备上下文句柄;nXDest、nYDest为目标矩形左上角的x、y坐标;nWidth、nHeigh为位图的宽度和高度;hdcSrc为原来的设备上下文句柄;int nXSrc、nYS-rc为源位图的x、y坐标;dwRop为贴图方式。如果将BitBlt()放在定时器处理函数中,就可以实现图像的运动了。

3 举例说明

3.1 方式一

例如用方式一实现小球运动的步骤和代码如下:

(1)载入小球位图

(2)启动定时器

(3)贴图并控制小球移动的位置

(4)运行效果如图1。

小球将在屏幕中间左右来回移动。

3.2 方式二

如果是在定时器中重新绘制,就必须在消息处理函数中添加绘图代码。例如也要实现上面的效果,步骤和代码如下:

(1)创建一个与显示DC的兼容内存DC和位图。

(2)利用OnDraw将内存DC的内容拷到显示DC。

(3)在内存DC中绘制小球。

其效果同上。

4 总结

在掌握了这些基本的方法之后,就可以做出更为复杂的运动效果。在工控中,最常用到的就是动态曲线,以实现对采集数据的实时显示和监控,如图2。

在某些数据的处理中,也可以以曲线的形式显示出计算结果。在单文档中多用第二种方法实现,所有的工作都在内存DC中完成,最后再贴到显示DC。如果是在基本对话框中,就须将代码加在OnPaint()函数中。有了这些绘图基础,实现动态就很简单了。

摘要:在可视化程序设计中,经常需要实现操作界面图像运动的效果。本文就实现图像运动的基本方法进行了一个简要的介绍并以实例加以说明。

关键词:VC,图像运动,定时器,位图

参考文献

[1](美)汤普生(Thompson,R.D).MFC开发人员参考手册.北京:机械工业出版社,1998年8月.

利用VC++实现远程屏幕监控系统 第4篇

利用远程屏幕监控系统, 人们不再受地域、区域位置的限制, 可以监视、指挥网络上的其他计算机。操作远程计算机就像使用本机一样。该系统在家庭办公、远程教学、工业控制、网络管理等诸多领域都有重要的应用。人们享受便利的同时, 对终端合理有效的管理成为首要问题。本文主要研究在Windows平台下利用Visual C++6.0实现远程屏幕监控技术, 该语言提供了可视化的编程方法, 而且提供了强大的MFC (微软基础类库) , 从而加速了Windows应用程序的开发。

2. 关键技术

2.1 网络套接字编程

网络套接字是由微软公司等共同制定的一套在Windows操作系统下的网络编程接口, 即Window Sockets规范。对于每一个基于TCP/IP网络通讯的程序都被赋予唯一的端口和端口号, 任何一台计算机可以通过端口和一个具有Socket接口的计算机通信。对套接字进行编程, 首先初始化Socket端口, 并调用Socket创建套接字, 然后调用bind () 将该套接字和本地网络地址联系在一起, 再调用listen () 使套接字做好侦听的准备, 并规定它的请求队列的长度, 它负责响应到来的联接[1]。对于服务器端和客户端操作过程如图1所示。

2.2 Direct X技术

远程屏幕捕捉系统的最为基本功能是实时监视远程计算机当前屏幕显示的内容。本文采用的方式是是受控端在固定的时间间距不断地把自己当前屏幕信息发送给控制端, 控制端接收到屏幕图像后即时地显示在自己屏幕上。对于捕捉屏幕图像的方法很多种, 本文采用的Direct X技术, 它是微软公司创建的多媒体编程接口, 它由很多API组成, 由VC++编程语言实现, 遵循COM, 它旨在使基于Windows的计算机运行和显示具有丰富多媒体元素的平台。

2.3 LZW算法实现压缩和解压

受控端在一定的时间间隔内不断地将自己屏幕图像数据通过网络发送给远程控制端, 没有经过压缩处理的图像数据量相当庞大, 而控制端也要将接收到屏幕图像数据进行解压缩后, 才能正确地将屏幕图像显示出来。本文将采用LZW实现图像数据的压缩与解压缩。LZW算法是通过建立一个字符串表[2], 用较短的代码来表示较长的字符串来实现压缩, 运用遍历实现功能。解压缩过程相反。其过程如图2所示。

3. 系统设计及实现

远程屏幕监控系统分为客户端和服务器端, 双方建立连接后就可以互相传输数据了。因此该系统主要由服务端模块, 通信模块、客户端模块等组成, 各个模块合理调配、有效组织共同完成所需功能。

3.1 服务端设计

初始化变量和创建通信套接字, 然后在设定端口上监听, 等待客户端的连接请求。当客户端请求连接时, 服务器与此客户端连接, 读取客户端发来的数据, 分析客户端请求的操作。根据客户端的请求, 执行不同的操作并响应客户端[3,4]。其中部分核心代码如下所示, 其中涉及函数如表1所示。

3.2 客户端设计

客户端操作时首先输入服务端IP地址, 发送连接服务端的请求, 成功连接后将进入程序主界面, 可以选择相关功能实现对远程主机的操控[5]。其中捕捉屏幕部分核心代码流程如下所示, 实现该设计中涉及到的函数功能介绍如表2所示。

3.3 通信模块设计

被控端将本地计算机的名称、用户名、操作系统、硬盘序列号等发送到控制端。控制端运行后监听相应的端口, 当与被控端进行通信连接时, 临时存储连接到控制端的socket和相应的硬盘序列号, 这样实现控制端和被控端的连接以及两者进程之间的通信[6,7]。其中部分核心代码如下。

4. 试验仿真

利用该系统不但可以实现多屏监控, 还可以实现远程操作, 并对获取的信息进行编辑, 该系统设计界面如图3所示。为了验证本系统的实效性, 对该系统进行测试, 步骤如下:

(1) 登入系统并启动服务器端程序, 等待客户端的连接。

(2) 启动客户端的程序, 填写服务器端的IP和连接端口。

(3) 输入用户名和密码, 让服务器进行身份验证。

(4) 当在主界面选择“屏幕截取”时, 对方操作文件, 本主机检测是否成功监测。对方在打开的文档中写入东西、插入图片, 看能否实时响应。对方打开视频文件, 检测操作是否延迟。其结果如图4所示。

通过测试说明该系统捕获远程信息的有效性和实时性。由于本系统获取技术、传输算法等原因, 获取音、视屏有迟滞现象发生, 本系统将进一步做调整, 提高所有信息的实时性。

摘要:随着国家网络信息化建设, 计算机技术和网络技术得到飞速发展, 远程屏幕监控系统得到广泛的应用。本文以Visual C++6.0为开发平台, 实现从计算机屏幕上安全、快速的截取信息, 并将这些信息以图形图像的方式在远程计算机上进行显示。该技术为管理远程控制目标提供了很大的帮助, 具有很好的应用价值。

关键词:远程屏幕监控,套接字,Direct X,Vc++6.0

参考文献

[1]那询.王行言, Java语言程序设计北京.清华大学出版杜.2006.

[2]王建新.远程监控技术的发展现状和趋势.国外电子测量技术, 2005, 04:9-11

[3]余成波.陶红艳.设备远程监控技术的研究.计算机工程与应用, 2002 (18) :231, 248

[4]M Wooldrigde, et al.Intelligent Agents:Theory and Practice.Knowledge Enginneering Rewiew, 1995, 10 (2) :212-223

[5]Hyacinth S 11.Software Agents:An Overview.Knowledge EngineeringReview, 1996, 11 (3) :205-224

[6]NR Jenning.A Roadmap or Agent Research and Development.Autonomous

利用VC实现网络通信 第5篇

在unicode码越来越完善的情况下, 许多操作系统, 所有最新的浏览器和许多其他产品都支持它。Unicode标准的出现和支持它工具的存在, 是近来全球软件技术最重要的发展趋势。不仅可以很容易地在不同语言之间进行数据交换。还可以分配支持所有语言的单个二进制.exe文件或.dll文件, 并能提高应用程序运行效率。例如基于AT指令的中文短信的发送和读写就是个应用unicode码转换的典型实例。

在VC++界面中插入如图所示控件, 两个编辑框分别设置变量m_strChinese和m_strUnicode, 按钮关联函数OnbnclickedButton () , 要使用户在编辑框ID_strChinese中输入一个或多个汉字, 单击按钮后能方便地在另一个编辑框ID_strUnicode中回显出所输入全部汉字的Unicode码, 需要分三步进行:第一, 利用VC++的_bstr_ () 函数将变量m_strChinese中的汉字内容转成Unicode码, 即宽字节WCHAR类型;因为pdu模式只能识别ASCII码, 在ASCII码中, 一个英文字母 (不分大小写) 或数字占一个字节的空间, 故第二步要将每个字元占用2个位元组的WCHAR类型转换到四个字节分别存储;第三步, 将数字转换成char型。此时将转换后的char型代码赋值给变量m_strUnicode, 即可在编辑框ID_strUnicode中显示出汉字的Unicode码。详细代码为:

经实际测试, 该方案很好得实现了基于VC++的汉字转Unicode码, 例如汉字编辑框中随意输入一些汉字后, 在Unicode码编辑框中回显出一串代码, 经校对, 确实是所输入汉字的Unicode码。

需要指出的是该代码是在Visual studio环境中的格式, 若在vc6.0平台下, 需将WcharTo4Hex () 函数中的for (int i=0;i

本文系统地讲述了基于VC++的汉字转Unicode码的设计与实现, 该方案具有很强的使用价值。随着手机的广泛使用, SMS已经广泛地应用于监控定位系统、无线报警、远程维护及数据信息查询等各个领域。GSM模块收发中文短消息所采用的的PDU模式是支持中文信息的普遍应用的协议模式, PDU中的汉字编码即是Unicode。本文从它的原理、实现算法, 数据结构、代码编写方面作了详细的阐述, 实现了一种新的比较方便的转换方法。对中文输入法的发展具有重要的理论价值和现实意义。

参考文献

[1]曲卫华.手机中文拼音输入法的设计与实现[J].太原大学学报, 2008, (9) :1

[2]胡燕飞, 黄俊伟.短消息编解码算法研究及实现[J].通信技术, 2007, (5) :1-3.

利用VC实现网络通信 第6篇

首先通过插入属性页对话框,建立三个属性页对话框资源,分别用来显示道的属性IDD_DaoPage,曲线属性IDD_CurvePage,和坐标属性IDD_AxisPage。给每一个对话分别关联一个类CDaoPage,CCurvePage,CAxisPage,基类均为CPropertyPage,并建立该类的对象:

再定义两个属性表单类对象:

当双击对话框左侧的树形控件节点后,首先通过树控件的函数GetItemText获取被双击节点的内容,然后判断双击的是道节点还是曲线节点,以曲线节点被双击为例属性页的显示步骤如下:

首先判断在双击节点之前显示的是道的属性页还是曲线的属性页,如果是曲线的属性页则无需更改属性页的显示,只需将对应节点的数据属性更新到属性页中的编辑框中即可,否则需要更新显示为曲线的属性页,程序如下:

显示完成之后如图1,这个属性页上有两个选项卡“坐标属性”和“曲线属性”,用户可以通过点击这两个选项卡分别观察此节点的属性信息。

2 曲线、坐标和道属性的保存

上面的对话框中,当用户点击树控件的节点进入对应曲线的属性,及坐标和曲线所在道的属性时,属性页对话框更新显示为对应曲线名的所有属性。此时用户可以对属性进行更改,比如曲线的颜色,线型,刻度类型等,更改完这些属性后,用户切换到另一曲线的属性显示时,就要对先前更改的对应曲线的属性进行保存,这样软件才能根据保存后的值进行曲线的更新显示。对于曲线属性的保存通过自定义的动态结构体数组来实现,以“道”的属性保存为例:

在文档类的头文件中定义曲线,轴和道的结构体对象PSTRU_DAOPAGEStruDaoPage;//定义道的结构体指针,当打开数据后,根据读入的曲线的条数和应该建立的道的个数,建立动态数组如StruDaoPage=new STRU_DAOPAGE[8];每个结构体变量中都保存一个对应道的所有属性值。

当用°户从树控件的一个项目切换到另一个项目,如从“道1”切换到曲线i,则首先应该在道属性页的OnKillActive()函数中,保存“道1”的属性值从控件关联变量到STRU_DAOPAGE[1]结构体中,然后再在曲线属性对话框的OnSetActive()函数中,将存放对应曲线属性值的结构体STRU_CURVE[i]中的值赋值到对应的控件关联变量中,再更新控件显示即可。

参考文献

[1]孙鑫,余安平.VC++深入详解[M].电子工业出版社:271-273.

利用VC实现网络通信 第7篇

关键词:药代动力学,二室模型,非线性回归,高斯牛顿算法,VC

药代动力学应用动力学的原理与数学处理方法,定量地描述药物通过各种途径(如口服给药、肌肉注射、静脉注射等)进入机体内的吸收、分布、代谢和排泄等过程的动态变化规律。研究体内药物的存在位置、数量或浓度与时间之间的关系,并提出解释这些数据所需要的数学关系式。药代动力学是与计算科学同步发展的。计算科学为药物的动力学研究提供软件平台与理论指引。随着计算机科技的发展,药代动力学软件技术也随之不断地完善。VC编程平台具有良好的可移植性及灵活性,根据不同情况快速的获取需要的结果,因此应用该工具完成高斯-牛顿算法,实现药代动力学二室模型的非线性回归拟合模型,得到相应参数指标,以便对临床用药和药物设计等方面提供较为可靠的依据。

1二室模型[1]

药物进入机体后,在随血液输送到各个器官和组织的过程中,不断地被吸收、分布、代谢,最终被排除体外。药物在血液中的浓度,即单位体积血液中药物的含量,称为血药浓度。血药浓度的大小直接影响到药物的疗效。因此,药物动力学研究的主要对象是血药浓度随时间变化的规律———药时曲线。而在研究中常常会遇到重复测量数据如给患者静脉滴注用药后隔时测量血药浓度。而对很多药物而言,其在不同组织及器官间的速率及浓度是不同的。要反映这种变化,需要考虑更为复杂的模型。二室模型在药物动力学研究中应用很广泛,它将机体分为血液较丰富的中心室(vc,包括心、肺、肾等器官)和血液较贫乏的周边室,(vp,包括四肢、肌肉组织等)。药物经注射后进入中心室,再逐渐向周边室转运。两个房室之间药物可相互转移,并由中心室排出,如图1所示。

图1中,xe(t)、xp(t)分别为t时刻中心室及周边室内药量,k10为药物消除速率,k12、k21为药物在两个房室间的转移速率,则根据质量守恒定律及线性假设,可以得到方程组如下:

{dxc(t)dt=f(t)+k21xp(t)-(k12+k10)xc(t)dxp(t)dt=k12xc(t)-k21xp(t)(1)

对于上述线性微分方程组,根据不同给药方式,可以得到不同的药物浓度分布。下面以静脉注射(即假设药物的吸收交换和消除都是一级过程)为例,对式(1)的方程组进行求解[2]。

若设给药总量为D,则有初始时刻中心室内药量xc(0)=D,f(t)=0,xp(0)=0。对上述方程组求解,可以得到中心室的药量分布为:

xc(t)=Ae-αt+Be-βt (2)

式(2)中α又称为分布速率常数,β称为消除速率常数,可由αβ=k10k21,α+β=k12+k21+k10分解求出;两个系数分别为A=D(k21-α)/(β-α),B=D (β-k21)/(β-α)

2 高斯牛顿算法[3]

在目前药代动力学研究中,对于实验数据的处理主要采用线性化回归分析,最小二乘法对数据进行正交多项式曲线拟合,以及非线性回归分析三种方法。对先将函数线性化再进行线性化分析的方法可以有效地得到置信区间,但大多数的药代学模型更符合非线性的模型,有些药代学函数甚至无法进行线性化处理。对于一些教科书采用的正交多项式拟合方式用于分析血药浓度的趋势有时候虽然可以得到比较好的拟合曲线,但其多项式的函数类型却不一定能够符合药物代谢的一般规律,存在着数学特性相符而应用模型不符的缺陷。此外由于多项式的数学特性使得函数的预测能力不够完善,不仅预测值不准,而且预测变化率可能会有本质错误。而非线性回归分析与线性回归相比,在回归系数的最小二乘极小值意义下结果较好,在实际应用中如果结合专业知识和数据性态选好合理的非线性函数及参数的初始值,可以更为正确的得出专业性结论,从而更好的解释好统计学结果。

对于一般的非线性回归模型可以表示为

Y=f(X)+Δ (3)

式(3)中f(x)=(f1(x),f2(x),f2(x),……,fn(x))1是由nX的非线性函数组成的n×1的向量。

相应的误差方程为

V=f(X^-Y) (4)

残差平方和为

VV=V2=f(X^)-Y2=(f(X^)-Y)(f(X^)-Y)(5)

而高斯牛顿算法的就是在初值X(0)处对非线性模型进行线性近似,并按一般平差方法求出近似值X(1),然后反复迭代,直到前后两次值达到允许误差。其迭代步骤如下:

假设非线性模型式(3)存在一阶连续偏导数,且参数X之间相互独立,于近似值X(0)处线性化,得到误差方程:

V=B(X(0))dX-(Y-f(X(0))) (6)

再由最小二乘法原理:

X(1)=X(0)+(B′(X(0))B(X(1)))i-1B′(X(0))(L-f(X(0))) (7)

求得X(1)后,再以X(1)为近似值迭代,其迭代公式为:

X(k+1)=X(k)+(B′(X(k))B(X(k)))-1B′(X(k))(L-f(X(k))) (8)

终止迭代的条件为:

|R(Xk+1)-R(Xk)|<ε (9)

ε是一个假定任意小的常数,定义为一个允许误差范围的值。

高斯牛顿算法具有较好的合理性,对于线性模型,高斯牛顿算法可以从任意初值出发就能通过一次迭代得到一个比较精确的值。而在非线性拟合中模型的非线性强度不强时,也是较好的方法。

算法流程图如图2所示。

3 利用VC实现算法

通过导入一组包含血药浓度和时间的二维数据,利用嵌入的高斯牛顿迭代函数调用该组数据,直接可以输出二室模型的参数A,B,αβ。通过该组参数,再进一步求解具有药代学意义的一系列参数:

① 药物的分布相半衰期tα/2=0.693α;

② 药物的消除相半衰期tβ/2=0.693β;

③ 药物由周边室向中心室的分布速率参数k21=(Aβ+Bα)/(A+B);

④ 药物的中心室消除速率参数:k10=αβ/k21。

⑤ 药物的中心室向周边室的分布速率参数k12=α+β-k10-k21;

⑥ 药物的中心室分布容积V1=D0/(A+B);

⑦ 药物的消除速率:CL=V1k10。

最后计算可决定参数R2来对模拟效果进行评价:

R2=1-t=1n(Ci-C^i)/t=1n(Ci-C^i)

对于计算结果R2的值越接近1则表示拟合结果越好。

接下来,我们在实验室的计算机(处理器:赛扬D 2.0 GHZ,内存:512 M,操作系统:Microsoft Windows XP,编程环境:VS2005)上实现了该算法,以磺胺噻唑(D0=250 mg/kg)二室模型的动力学参数测定为例[4],实验数据如表1所示。

通过导入数据经过程序处理可以获得二室模型的系数值为:

A=683.132 1,B=208.011 2,α=0.090 7,β=0.002 9。

从而获得了磺胺噻唑的药代学模型为:

C=683.131 2 e-0.090 7 t+208.011 2 e-0.002 9 t通过程序绘制图形如图3所示。

从图形上可见拟合曲线和实际数据点较好。计算获得参数列表比较如表2。

通过比较可决定系数R2有0.988 6<0.998 5<0.998 7,说明EXCEL处理的结果不够准确,不能更好的反应磺胺噻唑的药代学过程;而高斯牛顿算法处理的结果与MATLAB比较一致。再由表中参数数据可知,三者得出的参数有一定的出入,这与曲线拟合的好坏是有关系的,拟合得越准确,参数的意义就大,提供信息就越好。

4 讨论

在用EXCEL处理二室模型的数据时,常把模型分为分布相和消除相,采用分段拟合来进行,即通常所用的残差法。由于指数可以转化为对数而成直线,以此分两段直线进行拟合而得各个系数以及各个参数值,具体的处理过程在此不再详述。由于它不是把整个模型连续起来而且前后选点的个数均受到实验及自身条件等因素不能正确选择,处理时可能带来误差、计算的麻烦及处理的不准确性,另外EXCEL对整个拟合不能做出很好的评价。但可以很好的表达出药物的生理学和临床上的意义[5]。

而使用MATLAB进行二室模型的数据处理时,一般是使用内置命令函数编写特定的命令序列,其函数集比较丰富,数据处理也具有一定的合理性,但MATLAB可移植性较差,使用时必须安装对应软件,因此在使用上便捷性较差,在数据处理时特定性较强,不利于药代数据处理的普适性。虽然其方法在数值处理上比较精确合理,拟合度也比较好,但是由于其拟合方法上却决定了可能存在曲线拟合较好,但参数不符合药学意义的缺陷。

而采用高斯牛顿算法原理的VC程序则先利用残差法求解得到一个粗略的初值后,通过迭代得到一个较为满意的准确值,在一定程度上既克服了高斯牛顿迭代本身存在的收敛缺陷,又满足了药代学模型在精确度和生理学意义上的要求。

5 结论

对高斯牛顿算法在药代动力学数据信息处理上的应用进行了一定的研究,并通过VC平台和MATLAB、EXCEL进行了比较。可以看到以高斯牛顿迭代进行的非线性拟合模型具有较好的拟合精度,在实际的应用中根据专业知识和实验数据的性态选择合理的函数初值能够很好的为临床用药和药物设计提供有效措施,从而正确的解释统计结果,得到更好的专业结论[6]。

参考文献

[1] 王广基.药物代谢动力学.北京:化学工业出版社,2005

[2] 白净. 生物系统的仿真与建模.北京:清华大学出版社,2004

[3] 马广立.药物动力学相关计算研究及软件开发,2004

[4] 李历民,朱珊珊.基于MATLAB的药代动力学实验数据处理及参数估计.数理医药学杂志,2007;20(1):5—6

[5] 宋谦和,苏银法.基于Excel软件的二室模型血管外给药的方案设计.数理医药学杂志,2004;17(4):300—302

上一篇:教师的教学幽默素养下一篇:颈丛神经论文