VC++网络编程

2024-06-01

VC++网络编程(通用12篇)

VC++网络编程 篇1

摘要:网络通阻是网络运行状态的重要指标之一, 常见的网络管理软件过于复杂, 而系统自带的ping工具又无法进行检测数据的统计。该文在分析ICMP协议的基础上, 利用VC编程环境中的网络通信、多线程编程技术, 采用模块化设计开发方法, 实现了网络节点状态的动态监测。通过调用网络监测模块, 完善节点管理、指标分析和界面显示等功能, 完成对多个节点的网络监测和故障统计应用, 已经用于某单位重要网络节点的监控管理, 系统占用系统资源少、运行稳定。

关键词:VC编程,多线程,模块化设计,网络监测

尽管存在各式各样的网络工具, 但ping还是人们最常用的检测工具, 可以简单、有效的掌握网络运行状态, 遗憾的是无法进行检测数据的统计分析。利用VC强大的网络通信、多线程开发资源, 只需集成调用相应的功能, 就可以实现类似ping的网络状态在线监测和数据分析。在软件的开发过程中, 充分利用已有的成熟开发资源, 构建针对性的应用模块, 不仅可以提高开发效率, 还可以提高软件的质量。该文首先分析了核心网络监测功能模块的设计和开发, 结合网络运行维护中需要实时在线监测关键节点状态的需求, 给出一个完整网络管理应用系统解决方案, 能够实现上级节点对下级节点的网络运行状态的监控、故障统计和分析等功能。

1 监测功能模块实现

1.1 功能模块设计

ping实际上采用的是ICMP协议。ICMP协议是TCP/IP协议族的一个子协议, 用于在IP主机、路由器之间传递控制消息。Windows提供了ICMP.dll, 可以在VC中调用, 但不具备移植性, 而且很难对网络数据包进行控制。所以采用VC提供套接字 (socket) 进行网络编程, 选择和ping程序一样发送32字节的数据包, 获取返回数据包大小和TTL值, 需要在工程中包含afxsock.h库文件。

编程流程及系统调用时序如图1所示。

1.2 网络状态检测

1.2.1 创建套接字

1.2.2 发送ICMP数据包

初试化ECHOREQUEST的type为8的响应请求报, 然后通过系统调用发送ICMP包。

1.2.3 检测套接字状态

如果n Ret为SOCKET_ERROR, 则表明该次在套接字s上发送数据不成功, 也就说明未收到响应数据, 检测失败。

1.2.4 读取响应数据, 判断状态

在响应数据包内, 包含了该次检测响应结果的TTL。至此, 实现了同ping方式一样的网络检测。

1.3 多线程监测

网络状态检测模块只需要获取目标IP地址数据, 并不需要用户界面交互, 因此创建单独的线程定时运行实现在线网络状态监测, 实现后台运行。

创建互斥事件对象, 用于设定网络检测模块的工作状态。

2 动态节点监测应用案例

在网络监测功能的基础上, 通过适当的人机交互界面和配置数据管理, 就可以构建一个完整的网络管理应用系统。

2.1 系统功能组成

系统功能由网络检测、状态显示、节点管理、指标分析等四部分组成, 分别完成网络节点通阻状态的存储、检测、分析和显示。状态显示又分为客户端图形模式和动态网页模式, 客户端图形模式采用C/S架构, 可以对系统检测周期和节点属性等参数进行配置, 查看节点状态, 完成数据分析, 录入故障原因等;浏览器网页模式主要用于查看节点状态和指标分析数据。如图2所示。

2.2 检测流程

系统根据设定的检测间隔和节点是否检测, 形成检测节点列表, 启动检测流程。检测流程如图3所示。

系统运行界面如图4所示。

3 结语

通过利用VC开发环境提供的网络、多线程类库和函数, 实现了网络状态监测模块的开发, 并以此为基础构建了一个简单的网络管理应用系统。由此可见, 软件的模块化开发, 一是要充分利用已有的开发平台资源, 提高软件开发效率;二是要合理划分模块, 优先实现关键模块功能, 提高开发的针对性。

参考文献

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

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

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

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

VC++网络编程 篇2

VC图像编程教案 第三章

VC图像编程教案 第三章 3 DIB类的高级应用。 3.1 BMP文件结构 BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 typedef struct tagBITMAPFILEHEADER { WORDbfType; // 位图文件的类型,必须为BM DWORD bfSize; // 位图文件的大小,以字节为单位 WORDbfReserved1;  // 位图文件保留字,必须为0 WORDbfReserved2;  // 位图文件保留字,必须为0 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图 // 文件头的.偏移量表示,以字节为单位 } BITMAPFILEHEADER; BMP位图信息头数据用于说明位图的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{ DWORD  biSize; // 本结构所占用字节数 LONGbiWidth;  // 位图的宽度,以像素为单位 LONGbiHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的级别,必须为1 WORD biBitCount// 每个像素所需的位数,必须是1(双色),   // 4(16色),8(256色)或24(真彩色)之一 DWORD  biCompression; // 位图压缩类型,必须是 0(不压缩),   // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD  biSizeImage; // 位图的大小,以字节为单位 LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数 LONGbiYPelsPerMeter;  // 位图垂直分辨率,每米像素数 DWORD  biClrUsed;// 位图实际使用的颜色表中的颜色数 DWORD  biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER; typedef struct tagRGBQUAD { BYTErgbBlue;// 蓝色的亮度(值范围为0-255) BYTErgbGreen; // 绿色的亮度(值范围为0-255) BYTErgbRed; // 红色的亮度(值范围为0-255) BYTErgbReserved;// 保留,必须为0 } RGBQUAD; 颜色表中RGBQUAD结构数据的个数有biBitCount来确定: 当biBitCount=1,4,8时,分别有2,16,256个表项; 当biBitCount=24时,没有颜色表项。 位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位图信息头 RGBQUAD  bmiColors[1];  // 颜色表 } BITMAPINFO; 3.2 DIB类的Read函数: BOOL CDib::Read(CFile* pFile) {  // 1. read file header to get size of info hdr + color table  // 2. read info hdr (to get image size) and color table  // 3. read image  // cant use bfSize in file header  Empty;  int nCount, nSize;  BITMAPFILEHEADER bmfh;  try { nCount = pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER)); if(nCount != sizeof(BITMAPFILEHEADER)) {  throw new CException; } if(bmfh.bfType != 0x4d42) {  throw new CException; } nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER); m_lpBMIH = (LPBITMAPINFOHEADER) new char[nSize]; m_nBmihAlloc = m_nImageAlloc = crtAlloc; nCount = pFile->Read(m_lpBMIH, nSize); // info hdr & color table ComputeMetrics(); ComputePaletteSize(m_lpBMIH->biBitCount); MakePalette(); m_lpImage = (LPBYTE) new char[m_dwSizeImage]; nCount = pFile->Read(m_lpImage, m_dwSizeImage); // image only  }  catch(CException* pe) { AfxMessageBox(Read error); pe->Delete(); return FALSE;  }  return TRUE; } 3.3 DIB类的Write函数: BOOL CDib::Write(CFile* pFile) {  BITMAPFILEHEADER bmfh;  bmfh.bfType = 0x4d42;  // BM  int nSizeHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;  bmfh.bfSize = 0; // bmfh.bfSize = sizeof(BITMAPFILEHEADER) + nSizeHdr + m_dwSizeImage;  // meaning of bfSize open to interpretation (bytes, words, dwords?) -- we wont use it  bmfh.bfReserved1 = bmfh.bfReserved2 = 0;  bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +  sizeof(RGBQUAD) * m_nColorTableEntries;   try { pFile->Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER)); pFile->Write((LPVOID) m_lpBMIH,  nSizeHdr); pFile->Write((LPVOID) m_lpImage, m_dwSizeImage);  }  catch(CException* pe) { pe->Delete(); AfxMessageBox(write error); return FALSE;  }  return TRUE; } 3.4 明确图像文件 CFile CDib类三者之间的关系 3.5 尝试直接用CDib类的m_lpImage成员读取图像数据。 3.6 尝试通过Write保存图像到另一个位置 3.7 尝试通过Write重写原图像文件(注意保存)

如此VC系列之七:私奔的VC 篇3

VC界再次轰动了。不仅仅是VC界,整个互联网都被这条VC大佬私奔的消息震撼了。迅速地,新闻从线上传播到线下,连我那从来搞不懂VC为何物的老母亲都在电话上神秘地告诉我“你有个同行私奔了”。

在百度百科上查询“私奔”这个词,原义指女的不顾阻拦投奔所爱的人或一块儿逃跑,旧指女子未经婚嫁私自投奔所爱的人或跟他一起逃走。可见时代变迁,如今男的也可以私奔,而且已经婚嫁的男子也可以私奔。

私奔的现象如今确实少了。一则不行就离呗,现代人有几个还会想不开,搞一哭二闹三上吊的呀;二则即使原配硬挺着不离,养小二小三的不也大有人在嘛。这里并不想讨论该还是不该的问题,只是作为一种社会现象,它确实存在。

私奔的故事古今中外皆有之,也不至于引起如此轩然大波,搞得举国皆私奔:私奔之歌曲,私奔之电影,私奔之广告,甚至私奔之团购!如此之曝光率,如此之影响力,皆因这故事的主角是一个VC,知名的VC。如果是任何其他的人,都没有理由造成如此大的轰动,如此令人难以置信。VC是什么样的人啊,典型的精明、冷酷,能够准确计算得失,从不将自己置于不利位置。竟然,就是这样一个叱咤资本市场的大鳄,就在刚刚庆祝完自己项目美国上市,又带来数十倍回报的时候,做出了这样一个似乎未经任何计算,理智为感情绑架的行为。公众预期与实际故事的巨大落差是这一事件受到超常关注的重要原因。

事件的快速传播则受益于网络的力量。首先它源起于其本人的微博。古老的私奔故事里,主人公通常会给亲人留一个纸条,顶多纸条会传播多几个关注的人。然后这些人在遍寻不着,扼腕叹惜之后,就渐渐忘记这档子事,给予主人公想要的私密与平静。当这一消息出现在微博这样的公众平台上时,私奔就不再“私”了。你可能以为你不过与坐在旁边的朋友窃窃私语,谁知全礼堂的人都听见了,因为你是名人,就如同戴了扩音器,如同向世界宣告一般响亮。我们的VC朋友有幸成为微博宣布私奔的第一人……有炒作之嫌,也有人怀疑是替微博制造人气。

利用VC实现网络通信 篇4

许多用户所开发的应用程序需要实现网络间的数据通信,因此,笔者利用在Visual C++ 6.0中进行Windows Sockets应用程序的开发,阐述一下有关网络间数据通信程序的开发方法。

套接字(Socket)最初是由加利福尼亚大学Berkeley分校为UNIX操作系统开发的网络通信接口,随着UNIX操作系统的广泛使用,套接字成为当前最流行的网络通信应用程序接口之一。90年代初,由Sun Microsystems,JSB Corporation,FTP software,Microdyne和Microsoft等几家公司共同制定了一套标准,即Windows Sockets规范。

Windows Sockets API是Microsoft Windows的网络程序设计接口,它在继承了Berkeley Sockets主要特征的基础上,又对它进行了重要扩充。这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制 。这些扩充有利于应用程序开发者编制符合Windows编程模式的软件,它使在Windows下开发高性能的网络通信程序成为可能。

Socket实际上是指一个通信端点,借助于它,用户所开发的Socket应用程序,可以通过网络与其它Socket应用程序进行通信。

1网络通信程序的开发环境

在以下的介绍中,我们将以在Windows 2000环境下的开发为例。

编程语言采用Microsoft Visual C++ 6.0。在有关套接字方面,Visual C++6.0对Windows Sockets库函数进行了一系列封装,继而产生了CSocket 、CSocketFile等类,它们封装着有关Socket的各种功能。

所采用的网络通信协议一般是TCP/IP。但是,所开发的网络通信应用程序并不能直接与TCP / IP核心打交道,而是与网络应用编程界面Windows Sockets API打交道。Windows Sockets API则可直接与TCP/IP核心进行沟通。TCP/IP核心协议连同网络物理介质(如网卡)一起,都是提供网络应用程序间相互通信的设施。其关系如图1所示。

在采用TCP/IP网络协议的应用中,各网络节点计算机之上的Windows Sockets网络通信程序之间相互作用的主要模式为客户/服务器(Client/Server)模式。即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。采用这种模式的网络应用程序在进行通信时,服务器方的网络应用程序需首先启动,并打开一通信通道告知本地主机,它可以在某一公认地址上(保留端口,如文件传送协议FTP为21)接收客户请求。而客户方的网络应用程序随后启动,并打开一通信通道,连接到服务器所在主机的保留端口。

Windows Sockets支持两种类型的套接字,即流式套接字(SOCK-STREAM)和数据报套接字(SOCK-DGRAM)。对于要求精确传输数据的Windows Sockets通信程序,一般采用流式套接字。流式套接字提供了一个面向连接的、可靠的、数据无错的、无重复发送的及按发送顺序接收数据的服务。其内设流量控制,避免数据流超限,同时,数据被看作是字节流,无长度限制。

2使用Visual C++ 6.0进行Windows Sockets通信程序开发的基本步骤

通信程序由两部分构成,一部分是服务器程序,另一部分是客户端程序。

1) 服务器程序

打开VC,新建一个工程,第一步选择对话框选项,第二步勾选Windows Socket选项,其它默认。

在生成的MFC框架中,已经包含了Socket的初始化,我们将添加两个基类为CSocket的类分别实现Socket的监听(CListeningSocket)和与客户端的通信(CClientSocket)。在CListeningSocket类中,添加函数OnAccept负责Socket的监听,当有客户端连接服务器时,执行此函数。在CClientSocket类中,添加函数OnReceive和OnSend负责接收和发送数据。

在由VC自己生成的对话框类中添加三个处理函数ProcessPendingAccept、ProcessPendingReceive、ProcessPending-

Send,分别处理客户端的连接、数据的接收和数据的发送。在ProcessPendingAccept中,添加如下代码,

现在一个简单的网络服务器就构建成功了,下面介绍客户端程序。

2) 客户端程序

与服务器程序相同,新建一个包含Windows Socket选项的对话框工程。

在生成的MFC框架中,同样已经包含了Socket的初始化。我们将添加一个基类为CSocket的类来实现与服务器的连接和通信(CChatSocket)。在CChatSocket类中,添加函数OnReceive和OnSend负责接收和发送数据。

在由VC自己生成的对话框类中添加两个处理函数ProcessPendingReceive、ProcessPendingSend,分别处理数据的接收和数据的发送。在ProcessPendingReceive中,添加如下代码,

现在一个简单的客户端程序就构建成功了。

先打开服务器程序,然后打开客户端程序,可以相互发送简单的聊天信息。

3结束语

以上通过一个简单服务器/客户端程序介绍了Socket的使用方法,实现了基本的网络传输。本文的实现,对于需要在应用程序中加入网络传输、网络控制和网络共享等功能,提供了理论基础,具有实际的参考和推广价值。本文在Windows 2000、VC6.0下调试成功。

参考文献

[1]蒋东兴,林鄂华.Windows Sockets网络程序设计指南[M].北京:清华大学出版社,1996.9.

VC图像编程教案 第四章 篇5

VC图像编程教案 第四章

设备描述表的应用及常用windows消息响应 图像编程中,难免会遇到需要绘图的问题,比如角点的标记,绘制坐标轴,文字(图像)显示等等。所以掌握一些设备描述表的应用也是很有必要的。非常详尽的关于设备描述表的讲述请参阅我空间里的`另一篇文章“关于设备描述表”。 CDC中常用的GDI函数: 绘制直线: CDC::MoveTo CDC::LineTo 绘制矩形: CDC::Rectangle 绘制圆: CDC::Ellipse 输出文字: CDC::TextOut 像素值: CDC::GetPixel CDC::SetPixel 更改设备描述表属性: CDC::SelectObject 有关设备描述表的属性类: 画笔 CPen::CPenCPen( ); CPen( int nPenStyle, int nWidth, COLORREF crColor ); throw( CResourceException ); CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL ); throw( CResourceException ); 画刷 CBrush::CBrush CBrush( ); CBrush( COLORREF crColor ); throw( CResourceException ); CBrush( int nIndex, COLORREF crColor ); throw( CResourceException ); CBrush( CBitmap* pBitmap ); throw( CResourceException ); 透明画刷声明方法: CBrush *brush; brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); 在讲解常用Windows消息响应时尝试使用这些方法。 作业: 实现一个在图像上随鼠标移动的选择框,并将选择框内的内容在点击右键时进行直方图均衡化。 第四章 TITLE=VC图像编程教案  第四章 TITLE=VC图像编程教案 

 

VC“霸王条款”先行 篇6

“我们要学习一下国外的VC和PE是如何进行风险控制。”在刚刚拿到证监会下发的券商直投牌照后,一位即将上任的直投公司财务总监对他的同事说道,“尤其要看看外资PE的投资条款清单。”

在美国,VC可能会突然出现在创业者面前,表示愿意与创业者携手努力,接着就拿出了这么一份投资条款清单。只有认真阅读这份清单,创业者很快就会从狂喜中清醒过来,因为清单中开列的条件,包括清算优先权和防止稀释条款等等,是那么地苛刻,甚至有人称之为“霸王条款”。

VC和PE在中国内地兴起的时间相当有限,南孚电池和蒙牛乳业等大项目尘埃落定之后,国内投资者才开始感慨资本运作的多样性。但是在国际市场,风险投资和杠杆收购已经经历了较长的发展时间,投资条款清单就是在VC等基金发展过程中,形成的重要风控手段。

不妨就来看看投资条款清单的重要款项——清算优先权。优先清算权是投资条款清单中一个非常重要的条款,它直接决定了被投资公司如果接受清算,蛋糕该怎么分配。在欧美,几乎所有VC都会选择认购可转换优先股(集合债务和权益工具于一体的证券)的投资方式,并约定必须获得清算优先权。也就是说,一旦企业因为并购或者破产发生清算事项,VC可以在债权人、创业者和团队之前抽回之前的投资资金。

更重要的是,不少投资条款清单上甚至列明了在清算前,VC可以收回的资金是最初投入资金的至少两倍,投资风险也就大大下降了。

“清算优先权只是其中一项。在那份十几页的投资条款清单里,有几十项这样苛刻的条件。”在香港中环皇后道的咖啡屋里,一位创业者回忆起了他接触VC的经历,“我觉得追随权(Tag Along Rights)”和“领售权(DragAlong Rights)更加让人难以接受。”

在欧美,基金入股之后,企业通常要单方面接受限售协议,基金的股票可以转让,而创业者的股票却有一段时间锁定期。追随权是规定基金可以制定某个限售股东转让股权,而其他股东必须追随基金留下,领售权则规定基金可以凭借一己之力处置企业,包括启动IPO和进行并购交易。

当然,各家都有自己的说辞,基金也肯定会对自己的“霸王条款”提出辩护。“提出严厉的投资条款,能够让我们做好风险控制。”在上海陆家嘴,一家外资VC的经理对笔者谈起了他们的看法,“我们投资的企业差异很大,但是投资条款清单中的款项非常标准化,应对各种项目都能够大幅降低投资风险。”

但是问题在于,中国的投资业务兴起时间不长,因此目前的法律体系也无法认同投资条款清单中的内容。以清算优先权为例,它与中国的《企业破产法》就存在冲突,基金根本无法在企业申请破产前获得优先偿付。

因此,投资条款清单更多地运用在离岸业务上。“在帮助企业海外上市之前,我们都会帮助它在海外成立特殊目的公司,然后我们的基金就和这家特殊目的公司签订投资条款清单。”某国际PE中国区负责人谈道,“由于双方法律主体都在海外,就可以更好地享受投资条款清单的保护性条款。”

随着政府成立产业投资基金发展,并开放证券公司直接投资业务牌照之后,国内VC和PE行业出现了高速发展,经理们也都开始努力把国际经验运用到基金管理业务中。

VC++编程实现多模式近似匹配 篇7

目前, 近似字符串匹配在入侵检测、文件检索、文本过滤、信息查询等许多领域有着广泛的应用, 是当今计算机算法研究的重要课题之一。虽然单模式近似匹配算法的研究已经日趋成熟, 但是, 多模式近似匹配算法仍存在缺少支持汉字等大字符集的现状。文中在研究多模式精确匹配算法及单模式近似匹配的基础上, 提出了一种能够实现大字符集多模式近似匹配的BKDR-BPM算法, 并给出了算法的C++语言实现。

2 BKDR-BPM算法

2.1 近似匹配的定义

近似字符串匹配指的是给定一个文本T[1:n], n是文本长度, 一个模式P[1:m], m是模式的长度, 以及容许的最大误差k (k

2.2 算法设计

受经典的多模式匹配算法—WM算法[1]的启发, 多模式近似匹配算法分两步进行, 第一步是对多个模式字符串求出HASH值, 构造HASH表, 为了最大程度地分散链表的入口地址, 采用BKDRHash算法[2]进行散列处理, 当模式数量大时, BKDRHash算法的碰撞率较低, 性能较好。在扫描文本过程中, 一旦遇到HASH值相等的字符串, 则进行第二步处理;第二步是进行单个模式的近似匹配, 单模式近似匹配采用动态生成矩阵与位向量相结合的BPM算法[3], 因此多模式近似匹配算法命名为BKDR-BPM算法。图1是该算法的流程图。

BKDR-BPM算法首先对输入的文本按块计算HASH值, 块的大小通常设置为4个字节, 计算HASH值采用BKDRHash算法, 根据求得的HASH值查HASH表, 如HASH表的链指针不为空, 则说明有可能发生匹配, 需要进行单模式的近似匹配。在进行单模式近似匹配时采用BPM算法。以模式集合“科学技术”和“理论研究”为例, 假设用BKDRHash算法求得的HASH值同为h, 则这两个词共用同一个HASH表入口地址, 为它们创建的结点以链表方式连接, 当扫描文本时遇到HASH值等于h的字符串时, 则调用BPM算法分别与HASH[h]指向的链表结点进行近似匹配, 如匹配成功则保存结果。HASH表如图2所示。

2.3 算法的数据结构

算法的数据结构主要是HASH表, HASH表的结点可用下面的结构体描述, 其中, pattern[64]表示模式, 即字符串, 每个模式长度为64字节, 对于英文这样的小字符集语言 (一个字母占用一个字节) 可以支持64个字母, 对于中文这样的大字符集语言 (一个汉字占用两个字节) 可以支持32个汉字。一个字节最多表示256种字符, 所以用数组Peq[256]表示, 变量定义为__int64类型是因为当前计算机字长通常不超过64位。_SIZE_OF_TABLE是HASH表的大小, 在本算法中定义为32K, 即215=32768, 因此, BKDRHash算法求出的HASH值需用15位表示:

3 BKDR-BPM算法的C++实现

下文用C++语言实现BKDR-BPM算法, 并用VC++6.0作为开发平台, 设计了一个基于对话框的多模式近似匹配的工程。

3.1 CHash Bpm类的设计与实现

工程构造一个CHash Bpm类用于实现BKDR-BPM算法, 类的定义代码如下:

CHash Bpm类的主要实现代码如下:

3.2 近似匹配的工程实现

用VC++6.0建立一个基于对话框的工程, 工程采用多线程技术, 创建一个辅助线程Thread Match () 用于模式的近似匹配, 代码如下:

工程的界面如图3所示, 以在文本文件“Sports0029.txt”中近似匹配模式“运动科学”、“体育科研”、“认识论”为例, 说明程序的用法。

(1) 如图3中标号1所示, 点击“选择文件”按钮, 选择待匹配的文件, 文件可以是任意语种, 上文以中文为例;

(2) 如图3中标号2所示, 输入关键词“运动科学”、“体育科研”、“认识论”, 容错字数=1, 需要注意的是, 容错字数不宜超过模式串长度的40%, 否则匹配结果的误差太大;

(3) 点击按钮“开始”, 如图3中标号3所示, 输出匹配结果, 共找到多项近似匹配, 最多只容许有一个错字, 对比原始文件, 结果正确。

4 结语

介绍了一种多模式的近似匹配算法——BKDR-BPM算法的设计思路及简要实现方法, 给出了该算法的工程实现, 并完成了一个较为完整的近似匹配应用程序, 可以支持任意语种。希望这篇文章能对从事模式匹配研究工作的编程爱好者们提供帮助。

摘要:提出了一种实现多模式近似匹配的BKDR-BPM算法, 分析了算法的设计思路及关键步骤, 并用VC++编程实现。

关键词:近似匹配,多模式,算法

参考文献

[1]S.Wu, U.Manber.A Fast Algorithm For Multi-Pattern Searching[J].Technical Report TR-94-17, University of Arizona.1994:1-11.

[2]http://www.byvoid.com/blog/string-hash-compare/.

VC++网络编程 篇8

(1) MATLAB程序不能脱离其运行环境,可移植性差;

(2) MATLAB是一种解释性语言,语言执行效率低,实时性较差;

(3) MATLAB的界面开发能力较差,难以开发出友好的应用界面;

(4) MATLAB编写的M文件是文本文件,容易被直接读取,难以保护劳动者的成果。VC++用于面向对象的可视化编程,可以完成从底层软件直到面向用户软件等各种应用程序的开发。利用它提供的各种实用工具,开发者可以轻松开发出高效强大的Windows应用程序。但在实际工程开发中,与MATLAB相比:

(a) VC++在数值处理分析和算法工具等方面不如MATLAB;

(b) VC++在准确方便地绘制数据图形(数据可视化)方面不如MATLAB。

因此,把MATLAB在数值计算、算法设计以及数据可视化等领域的优势与VC++应用系统集成,不仅可以完全满足系统在数据运算与表现方面的需求,而且还可提高系统处理的效率和稳定性,同时也减少了开发人员实现算法的困难,缩短了软件开发的周期,提高了软件质量,在实践中具有很高的使用价值。

1在VC环境中调用Matlab程序主要有以下几种方法

1.1通过Matlab Engine方式

Matlab Engine是指一组Matlab提供的接口函数, 支持C语言, Matlab Engine采用C/S (客户机/服务器) 模式, Matlab作为后台服务器, 而C程序作为前台客户机, 通过Windows的动态控件与服务器通信, 向Matlab Engine传递命令和数据信息, 从Matlab Engine接受数据信息。用户可以在前台应用程序中调用这些接口函数, 实现对Matlab Engine的控制。采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行。

1.2直接调用Matlab的C/C++数学函数库

Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用CC++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。可以看出用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对CC++语言比较熟悉,可以看出使用这种方法调用Matlab的工具箱函数有很大困难。适合对CC++语言比较熟悉的用户使用。

1.3用Matlab自带的Matlab Compiler

Matlab Compiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令), 这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。到matlab R21.1为止,Matlab Compiler的m程序转换成C/C++代码功能有很多限制:

1.不能转换脚本m文件,只能转换m函数;

2.不能使用matlab对象;

3.不能用input或者eval操作matlab空间变量;

4.不能动态地命名变量,然后用load或者save命令来操作;

5.不能处理具有嵌套调用其他m文件的m文件;

6.不能使用MATLAB内联函数;

1.4使用matlab的combuilde工具

COM是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。matlab6.5新推出来的combuilder就是把用matlab编写的程序做成com组件,供其他语言调用。该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数 (注意:不支持脚本文件,脚本文件使用时要改为函数文件) ,因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab公司 (Matlab公司就是Mathworks公司) 推荐的使用方法。

1.5使用matcom工具。

这是个第三方控件,很小 (8M多) , 原本属于mathtool公司,后来被Mathworks公司合并了,使用该工具可以将m脚本文件和m函数转化成相同功能的CC++文件,相比其它方法使用matcom具有如下优点:

1.转换过程简单 (由matcom工具自动实现) ,容易实现;

2.可以方便的生成动态链接库文件 (dll) 和可执行文件 (exe) ;

3.不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;

4.设置环境后,可以使用Matlab的工具箱函数。

但matcom也有以下不足:

1.待编译的M文件不能涉及MATLAB的内部类;

2.部分绘图语句无法实现或得不到准确图象,尤其是三维图象。

因此在不涉及到三维做图以及m文件不大的情况下推荐使用。

综合考虑上述几种结合方式,MATCOM转化法最为简便有效,笔者认为是实现VC++与MATLAB联合编程的最佳途径。

2实现VC与matcom的接口步骤

首先安装matcom,然后运行Visual C++6.0,从菜单条中选择Tools/Customize/Add-ins and Macro Files,在出现的对话框中选中Visual Matcom Add-in,关闭对话框,这时在Visual C++[1]的开发环境中看到一个Visual Matcom工具栏,表明安装成功。

3应用举例

下面以一个线性方程组的求解过程为例,介绍通过matcom实现VC对Matlab程序的调用,运行环境:Windows XP、Matlab6.1、Matcom4.5、Visual C++6.0

X1+2X2+3X3=4

2X1+X2+2X3=-4

X1+3X2+3X3=8

Matlab运行环境中编写程序equation.m,其代码如下:

这里以一个简单的控制台程序为例,其它程序基本相同。在VC环境中建立一个名为Test的Win32 Console Application工程。

点击Visual matcom工具栏上的m++图标,选择保存过的Matlab文件equation.m进行转化。如果看到的转化信息提示没有错误就可以观察到此时在File View标签中多了m-files, C++files created from m-files, Matrix等文件。并且该工程目录下增加了equation.h, equation.cpp, equation.mak, equation.r等的4个文件。这时会在VC中出现一个转换完毕的文件,文件中如果报告有错误就要考虑是否程序有问题,可以双击C++files文件夹下的equation.m进行修改,再重新转化直到没有错误报告为止。

在Test工程下建立一个文件test.cpp调用转化的Matlab函数,代码为:

注意:程序中涉及到了两个成员函数.rows () 和.cols () ,它们分别返回矩阵的行数和列数;x.r (i, j) 代表矩阵x的第i行第j列的元素。

编译运行后结果为x (1, 1) =-4.000000 x (2, 1) =4.000000 x (3, 1) =0.000000与实际结果一致。

总结:如果需要转换的.m文件不是一个函数,只是一些Matlab命令的集合,则要在工程目录下找到转换文件的.cpp文件,将其中的C代码拷贝到需要调用它的函数里面。Matcom克服了mcc命令只能编译一个独立.m文件的缺点,当所编译的.m文件依赖于其他.m文件时,只要把被调用的.m文件与要编译的.m文件放在同一目录下,生成的被调用文件的.h和.cpp文件插入到VC开发的工程中就可以了。

上面只是一个简单的控制台工程的例子,我们也可以建立其它类型的工程,只要在需要调用转换后函数的程序中包含matlib.h并且在响应函数中初始化matlib库initM (MATCOM_VERSION) ;结束调用后做结束工作exitM () ;就可以了。

本文讨论了VC与Matlab的联合编程,主要集中讨论在VC中调用Matlab的实现方案。通过一个matcom编译实现的例子我们看到,利用Visual matcom转换代码非常方便,生成的代码可读性好,而且还支持多数图形函数,基本上使Matlab和VC能够得到充分的发挥。作者在图形处理中使用这种方法来提高程序的执行速度,取得了非常理想的效果。它不仅解决了Matlab的解释执行方式带来的执行速度过慢的缺陷,更重要的是它完全脱离了Matlab系统,当代码被编译成可执行程序后,又可大大提高程序的安全性。

摘要:本文在分析Visual C++和Matlab各自特点的基础上, 提出了几种联合编程的方案, 然后对各种方案进行比较分析。最后结合实例重点介绍了其中简便实用的Matcom联合编程方案, 该方案不仅能转化成C/C++函数, 而且可以支持图形函数功能, 还可以为科学研究和工程技术提供更强的技术支持。

关键词:Matlab,Visual C++,Matcom,联合编程

参考文献

[1]张志涌等.精通MATLAB6.5版[M].北京:北京航空航天大学出版社, 2003.

[2]阮沈勇等.MATLAB程序设计[M].北京:电子工业出版社, 2004.

PE/VC联合投资网络演化研究 篇9

近年来,我国学者们也逐渐开始关注PE/VC联合投资问题。郑鸣和陈石研究发现PE联合投资网络具有非凝聚性和地位不均衡的特征[7]。柯振埜,陈晓娟和林康康发现我国VC投资网络凝聚性较低,发展不均衡,核心、边缘区域密度差异较大[8]。还有一些学者则将PE/VC机构在联合投资网络中的特征作为解释变量,分析其对投资绩效及退出的影响。党兴华,董建卫和吴红超研究发现VC机构的网络位置对成功退出有显著的影响[9]。王曦和王育晓研究发现,VC机构的网络中心性程度越高,VC机构间网络距离越小,联合的可能性越高[10]。

从上述研究文献可以看出,有关PE/VC联合投资网络的研究议题和成果较多,大都集中在对PE/VC联合投资网络形成与投资绩效展开研究。然而,针对中国情景下整体层面的PE/VC联合投资网络动态演化的分析尚不多见。本文选取1999—2011 年PE/VC投资事件,构建PE/VC联合投资网络,检验是否存在小世界网络效应,探讨PE/VC网络动态演化特征。

1 PE / VC联合投资网络的构建

1. 1 数据来源

本文不在PE概念上做狭义PE与VC上的严格区分,选择广义的定义,包括VC、狭义PE和其他资产类私募股权基金,这样能更好地研究中国市场背景下的PE/VC联合投资网络的结构特征。数据来自CVSource投资数据库、WIND公司的PE / VC数据库和清科集团的Zdatabase数据库中投资事件,在1999—2011 年发生的8318 起PE / VC投资事件中,平均每起由6. 422 家投资机构参与,其中最少的有1 家,最多的有12 家。其中联合投资事件2305 起,所占比例约为27. 71% 。本文以1999—2011 年参与投资事件的1845 家PE / VC机构及6250 家被投资企业为节点,如果PE/VC机构i对企业j进行了投资,则认为节点对i和j之间有边相连,假设连接节点的边没有方向,且权系数等于1,1 代表两个投资机构至少联合投资过一次以上,0 则代表两个机构没有合作过。

1. 2 PE / VC联合投资网络

我们通过这些投资事件数据构建了PE /VC机构和被投资企业的双模网络,这种附属网络连接PE / VC和被投资企业,而不是PE / VC之间,这种双模网络很难用来直接解释。为了能够分析PE /VC网络动态演化特性,我们将双模网络转化为PE /VC单模网络。由于PE /VC联合投资网络的形成需要一段时间,因此,我们选取1999—2007 年作为网络数据处理初始时间窗口,采用滚动方式构建随时间变化的PE /VC联合投资网络,运用Pajek软件提取PE / VC联合投资网络的网络特征数值来刻画整体网络变化特征和可视化。

2 PE / VC联合投资网络特征分析

PE / VC联合投资网络的研究较为复杂,本研究主要从中心度和结构洞考察1999—2011 年间PE /VC联合投资网络的结构特征,其中网络中心度包括度数中心度、接近中心度和中介中心度。

度数中心度。度数中心度是一个最简单、最具有直观性的指数,它衡量的是网络中行动者自身的交易能力,如果一个点与其他许多点对直接相连,则该点就具有较高的度数中心度。如果PE/VC机构度数中心度越高,说明该PE/VC机构越处于网络中心位置,用于考察网络中单个PE/VC机构所拥有的关系数目,关系越多,认为PE/VC机构越有影响力[11]。表1 列出了度数中心度前25 位的PE。其中深创投拥有最多度数中心度,与207 个PE/VC机构进行过联合投资,关系份额为0. 112 3,这说明深创投比其他PE / VC机构更占据中心位置,更具影响力。另外,我们还发现,只有一小部分PE/VC机构,如深创投、英特尔投资、IDG资本等在联合投资网络中居于较突出的中心位置,大部分PE/VC机构的度数中心度小于10。

接近中心度。接近中心度用来衡量一种不受他人控制的程度,如果网络中某一PE /VC机构在交易过程中较少依赖其他PE /VC机构,则此PE /VC机构就具有较高的接近中心度。如果一个PE /VC机构接近中心度越小,说明该节点到达所有PE /VC机构的距离越短。用于考察一个PE / VC机构和处于网络最优位置的其他PE机构的联结程度。我们发现深创投、英特尔投资、IDG资本、红杉中国和永宣创投等拥有最多的接近中心度,因此处于网络的中心,这些PE /VC机构都是处在整个网络中突出的地位,这种凝聚性说明了网络位置突出的PE /VC机构之间的合作是相对较多的。

注: 表中列出了2011 年清科集团—中国创业投资暨私募股权投资年度排名前100 名的PE /VC机构的排名顺序,100 名以外的用符号”- ”表示。

中介中心度。中介中心度衡量的是行动者对资源控制的程度,如果一个点处于许多其他点对的最短路径上,则该点具有较高的中介中心度[12]。如果一个PE /VC机构的中介中心度越高,说明控制其它PE /VC机构交往的能力越强,在网络中的地位也越重要。通过对中介中心度的结果分析,我们发现深创投、英特尔投资、IDG资本、红杉中国等拥有较高的中介中心度,说明这些机构拥有较高的资源控制能力,且只有少数PE /VC机构在整个投资网络中具有较强的控制其他机构交往的能力,大部分PE / VC机构不具有控制力。

通过对三种中心度结果的比较,我们发现,它们之间存在高度的相关性,因此,一般在对PE /VC机构网络中心性特征分析时,通常采用一种中心度指标来衡量网络中心度。

结构洞。结构洞是指,对于三个PE/VC机构A,B,C来说,如果A和B有关联,B和C有关联,而A和C无关系的话,我们就说这种结构是一种结构洞,或者说在A和C之间存在一个结构洞,PE/VC机构B就扮演着协调或者控制作用。本文采用关系的“制约性”指标来间接测量网络中的结构洞,由于制约性指标代表了网络中关系的连通程度[13],本研究的结构洞变量通过制约性指标来测量,这个指标越高,代表PE/VC机构所拥有的结构洞越丰富。表2 为结构洞关系值前25 位的PE/VC机构。结果显示深创投、永宣创投、九鼎投资等具有较大的非冗余关系,拥有较多的信息资源和较强的控制优势。与前文中心度指标对比,我们发现处于网络中心位置的PE/VC机构大部分拥有丰富的结构洞,因而能够获得更多的控制收益和信息收益。研究结果与Thomas Keil等[14]研究发现一致,即拥有丰富结构洞的PE/VC机构容易受到其它PE/VC机构的邀请,成为联合投资的伙伴,进而进一步提升其在网络中的中心位置。

3 小世界效应检验

规则网络具有大的平均路径长度和大的聚集系数,而随机网络具有小的平均路径长度和小的聚集系数[15]。Watts and Strogatz( 1998) 通过以某个很小的概率改变规则网络中边的连接方式构造出了一种介于规则网络和随机网络之间的网络( 小世界网络) ,它同时具有小的平均路径长度和大的聚集系数,因此既不能当作规则网络处理,也不能看作是随机网络。通常采用文献[16]定义的小世界商数来衡量,其中,小世界商数= 集聚系数比率/平均路径长度比率。

本文研究的联合网络中,机构排名靠前的投资机构的小世界商数较大,从表3 可以看出,PE/VC联合投资网络具有小世界效应,即存在强者愈强、弱者愈弱的“马太效应”,部分PE/VC机构紧密地联系在一起。网络中任意两个PE/VC间往往通过为数不多的几个PE/VC就可以形成关联,集聚系数越大并与其他PE/VC机构之间关系更近的PE/VC机构竞争优势也越来越强。这也在一定程度上解释了PE/VC投资机构在选择联合投资伙伴时的策略,即处于网络中心位置或拥有丰富结构洞的PE/VC机构由于其拥有较高的声誉和能力,且通常拥有更多的资源,一般PE / VC机构通过与之合作扩展自己的资源网络,因此,它们容易成为其他机构选择的联合投资伙伴。

4 PE / VC联合投资网络演化分析

由于PE /VC联合投资网络的形成需要一个时间过程,本研究将网络形成过程划分成1999—2007年、1999—2008 年、1999—2009 年、1999—2010 年和1999—2011 年五个时间刻度。我们用Pajek软件分别度量这五个时间段内整体网络的特征值,以此来观测网络随时间演化的特征,从表4 和图1 可以看出,随着时间的推移,PE /VC的机构数量急剧增加。整体网络的平均度数( Average Degree) 稳步上升,说明节点在网络中的位置的重要性逐步增强。整体网络的中心性保持稳定,说明PE /VC联合投资网络是一个动态稳定的网络结构。强连接( Strong Components) PE /VC所占百分比逐步提升,说明处于联合投资网络中,紧密联系的PE /VC机构百分比不断提升。随着时间的变化,平均路径长度和最远路径长度保持稳定,分别在3. 4 和9 附近波动,说明整体网络中平均两家PE /VC之间的联系通过3. 4 个中介者完成,而最长则通过8 或9 家机构搭建“桥梁”完成。由此可见,PE /VC所形成的联合投资网络结构是一个总体稳定的结构,随着时间的推移,拥有合作关系的机构之间的联系逐渐加强,通过网络更加紧密地联系在一起。图2 至图4 分别为3 个时间段内节点度数在50 以上的PE /VC彼此合作的情况。从图2 至图4 可以看出,随着时间的推移,节点度数大于50 的PE /VC机构逐渐增加,且网络中PE /VC机构彼此合作也越来越紧密。结果表明,处于网络中心位置的PE /VC机构通常为了维护自己的声誉,在选择联合投资伙伴时,为了避免出现其他PE /VC机构的机会主义行为,它们也倾向于选择高声誉的PE /VC机构。

5 研究结论

由于PE /VC联合投资能够分散风险、资源共享、信息共享以及优化项目选择、有效管理创业企业,提高投资收益,越来愈多的PE /VC参与联合投资,本文以1999—2011 年间1 845 家PE /VC机构和6 250 家被投资公司为样本,构建了PE /VC联合投资网络,利用Pajek软件测度了网络中心性、结构洞和集聚系数等网络特征,并检验了是否存在小世界网络效应。结论如下: ①联合投资网络中的部分PE / VC优势明显。深创投、IDG资本、英特尔投资、红杉中国、达晨创投等PE /VC机构在网络中心性三个指标上都处于领先地位,且处于中心位置的PE /VC通常富含结构洞。②联合投资网络具有小世界网络特征。PE /VC机构之间可以通过较少的PE /VC机构就可以建立联系。③我国本土PE / VC投资机构逐步发展壮大。近年来虽然外资PE /VC机构处于网络中心位置,但本土的深创投、红杉中国、鼎晖、达晨创投等众多PE机构也逐渐进入前50 强。说明本土PE投资机构发展十分迅速,中国PE /VC机构的势力越来越强,另一方面外国PE /VC机构在中国资本市场上的活跃也说明了中国PE /VC市场具有良好的发展前景。

摘要:选取1999-2011年PE/VC投资事件,构建PE/VC联合投资网络,探讨PE/VC网络演化特征。研究发现:处于网络中心位置的PE/VC机构通常也拥有丰富结构洞;PE/VC联合投资网络具有小世界网络特征,即网络中任意两个PE/VC机构间往往通过较少的PE/VC机构就可以建立联系;随着时间的演变,本土的PE/VC机构逐渐开始占据网络中心位置。

VC++网络编程 篇10

多模式检索问题是指从文本中一次匹配多个模式, 例如, 给定文本text[1:n], n是文本长度, 一次匹配模式P1, P2, ……, Pq, q是模式的个数, 执行多模式匹配的速度要比对这些模式逐一执行匹配的速度快许多, 尤其是模式数量巨大时, 多模式匹配算法的速度优势更加明显。因此, 多模式匹配算法在网络信息过滤、入侵检测系统、文本向量化、信息全文检索等领域有着广泛的应用。

在多模式匹配算法中, Wu-Manber匹配算法是比较经典的, 该算法采用了跳跃的思想和hash散列方法, 是大规模多模式匹配最快的算法之一, 并且算法对字符集不敏感, 可以方便地应用于中文、英文等多种语言环境中, 在实际工作中应用广泛。下面给出Wu-Manber匹配算法的C++语言实现。

2 WM算法设计

2.1 算法概述

Wu-Manber算法 (简称WM算法) 是由Boyer-Moore算法派生而来的, 它从后向前判断当前位置的文本是否与模式匹配。先看看Boyer-Moore算法的思想, 例如, 要从句子“How many people were present at the meeting?”中查找“present”, “present”的长度是7个字符, 则从句子的左数第七个字符“n”开始匹配, 如图1所示。比较“n”与“present”的最后一个字符“t”, 不相等则说明句子“n”之前不可能有“present”, 但“present”中有字符“n”, 于是按照Boyer-Moore算法, 句子向后移动一个字符继续比较。从后向前比较可以最大程度地在文本中跳跃, 提高了匹配的速率, 于是WM算法秉承了这一设计思想。

虽然WM算法与BM算法一样从后向前判断文本是否与模式匹配, 但是由于WM算法是多模式匹配, 所以比BM算法复杂。WM算法能够支持多模式匹配的关键是建立适当的数据结构。

2.2 数据结构

WM算法的数据结构主要包括3张表, 移动表 (S HIFT[]) , 哈希表 (HASH[]) , 前缀表 (PREFIX[]) 。移动表决定当扫描文本时, 可以跳过文本中多少个字符, 比如图1中第一次向右滑1个字符, 就是由移动表决定的。当移动表的值为0时, 则由哈希表和前缀表来决定哪个模式是匹配的候选, 并进而验证是否匹配。模式匹配的步骤如下。

第一, 是确定模式的最小长度m, 以模式集合{“sent”, “present”}为例, 假定所有模式都具有相同长度, 这对提高算法的效率至关重要。通常取所有模式的最小长度, 例子中的最小长度为4。模式的长度决定了文本搜索时的最大位移, 模式的长度越小, 位移就越小, 匹配的效率也就越低。

第二, 为了提高文本搜索效率, 通常不是从文本中逐个字符进行比较, 而是从文本中取长度为B的字符串进行匹配。在实际应用中, 通常取B=2或B=3, 如果文本中的B个字符不与任何模式匹配, 那么就可以在文本中安全地向右移动 (mB+1) 个字符 (m是第一步求出的模式的最小长度) 。

第三, 如何构造移动表 (SHIFT[]) , 分两步进行。第一步确定移动表 (SHIFT[]) 的长度和初始值, 移动表 (SHIFT[]) 的长度由字符集大小来决定的, 英文的一个字符可由一个字节表示, 而中文的一个字需由两个字节 (即16比特) 表示, 由于本算法要支持中文, 所以移动表 (SHIFT[]) 的长度是216=65536字节。表中的数值都初始化为 (m-B+1) , 这就等于为每个可能出现的字符提供了一个默认的移动距离。第二步是根据模式集合修正移动表 (SHIFT[]) 的值, 这一步的目的是找出文本在所有模式中的最右出现, 取模式pi, q是扫描模式pi时剩余字符的长度, 则SHIFT[i]=min (SHIFT[i], (m-q) ) , min () 是取SHIFT[i]和 (m-q) 的较小值。

第四, 是建立哈希表 (HASH[]) , 为了避免文本的字符与每个模式的子串都进行比较, 可以使用哈希技术来最小化需要比较的数量。为此, 定义一个HASH函数, 计算B个字符的一个整数匹配值, 用作移动表 (SHIFT[]) 的索引。当B=2时, 函数表达式为h= (ti<

第五是建立前缀表 (PREFIX[]) , 为了提高效率, 减少开销, 把前缀表并入哈希表, 通常取模式的前两个字符作为前缀, 保存到一个变量中。综上, 可以得到哈希表 (HASH[]) 和前缀表 (PREFIX[]) 的数据结构如下。

以模式集合“sent”和“present”为例, 用最后两个字符‘n’和‘t’计算HASH值h, h= (‘t’<<5) +‘n’=0xEEE, 于是哈希表如图2所示。

2.3 多模式的匹配过程

下面简要说明多模式匹配的过程, 具体代码见下文WM类的Match () 函数。例如, 待查找的模式集合由“sent”和“present”组成, 待查找的文本是“How many people were present at the meeting?”。首先, 求出最小模式长度 (即“sent”的长度) m Min=4, 构造移动表和哈希表, 如图2所示, “sent”和“present”位于HASH[0x EEE]的同一链表中, 需要用前缀进一步区分, 取前两个字符作为前缀, “sent”的前缀是“se”, “present”的前缀是“pr”;其次, 由于m Min=4, 所以从文本的第4个字符‘m’开始比较, 比较按块进行, 取块的长度B=2, 于是求“ma”的HASH值, 查找哈希表HASH[], 如果HASH[]的next指针为空, 说明没有模式与之匹配, 如果不为空, 则先比较前缀, 前缀不一致则说明不匹配, 前缀一致再逐字符比较, 如果字符全部一致, 则报告发现一次匹配。当扫描到文本的字符“nt”时, 在哈希表HASH[]中对应的next指针不为空, 如图2所示, 于是进一步比较前缀, 以及逐字符比较, 就会发现文本中含有“sent”和“present”。

3 Wu-Manber算法的C++实现

下文用C++语言实现Wu-Manber算法, 并用VC++6.0作为开发平台, 设计了一个基于对话框的多模式匹配的工程。

3.1 WM类的设计与实现

工程构造一个WM类用于实现Wu-Manber算法, 类的定义代码如下:

WM类的实现代码如下:

下面的函数是求出模式集合中的最短模式的长度, 模式数组用pattern[]表示, num是模式的个数, 以模式集合{“sent”, “present”}为例, 返回值是4。

下面的函数根据模式的集合构造移动表和哈希表, 并为哈希表的前缀赋值, num是模式的个数:

3.2 多模式匹配的工程实现

用VC++6.0建立一个基于对话框的工程, 工程采用多线程技术, 创建一个辅助线程Thread Match () 用于模式匹配, 代码如下:

工程的界面如图3所示, 以在文本文件“数据挖掘.txt”中匹配模式“数据挖掘”和“文本向量化”为例, 说明程序的用法。

首先, 如图3中标号1所示, 点击“选择文件”按钮, 选择待匹配的文件, 文件可以是任意语种, 需要注意的是, 由于工程的设计重点是WM算法的实现, 所以只支持文本文件;其次, 如图3中标号2所示, 输入关键词“数据挖掘”和“文本向量化”;最后, 点击按钮“开始查找”, 如图3中标号3所示, 输出匹配结果, “数据挖掘”匹配了一次, “文本向量化”匹配了3次, 对比原始文件“数据挖掘.txt”, 结果正确。

4 结语

介绍了一种多模式匹配算法——WM算法的设计及简要实现方法, 指出了该算法的几个关键数据结构和步骤, 即如何构造移动表、哈希表和前缀表, 如何进行多模式匹配。虽然代码不多, 却实现了一个较为完整的多模式匹配应用程序, 并且可以支持任意语种。希望这篇文章能对从事模式匹配研究工作的编程爱好者们有所帮助。

摘要:介绍了经典的多模式匹配算法WU-Manber, 分析了设计思路及数据结构, 并用VC++编程实现。

关键词:WM算法,多模式匹配

参考文献

[1]S.Wu, U.Manber.A Fast Algorithm For Multi-PatternSearching[J].Technical Report TR-94-17, University ofArizona.1994:1-11.

VC向前 天使向后 篇11

总结下来,笔者的整体印象是:从行业上来分析,与往年集中在节能环保领域有所不同,今年的热点主要集中在云计算与物联网领域。而从项目的阶段来看,比较有特色的项目主要集中在互联网领域,主要是该领域的中早期项目。

应该说,时至今日,越来越多的VC开始将更多的目光聚焦到早期项目,创投行业的格局悄然发生变化。

那么,当越来越多的目光开始关注早期项目,整个创业投资的链条会发生怎样的变化?笔者简单总结为:VC向前,天使向后。

中国资本市场起步较晚,起步阶段又多年面临退出渠道不畅通的尴尬局面,在这个大背景下,基本上,中国式VC比较典型的套路是,早中晚三个阶段通吃,而且在创业板温度高涨的年代,一些VC机构参与PE项目的机会和次数也并不算少。但是,到了今天这种情况明显有所变化。

VC开始集体向前看。在近期的ChinaVenture中国投资年会上,多位知名VC都表示,今后VC要更关注早期项目,不能像过去几年一样追求“赚快钱”。

松禾资本董事长罗飞在近期的一次论坛上分析说,现阶段是早期投资的最好时机。“从1997年到2007年,我们在早期投资方面整个金额将近1亿,但失败的非常多……我们有个项目在2000年投资,在2007年上市。在2001、2002年我们适当做了早期的投资,有几个项目在2006、2007年上市。我们熬了十年,盼来了投资的春天。但是,2007年开始,又进入了PE抢项目的时代,我们看到越来越多的资金进入到中后期白热化的竞争”。

白热化竞争的直接结果是同质化。如何解决同质化?“我们还是拿起我们做早期投资的本质”。罗飞说。

与此同时,近一两年间,以雷军、薛蛮子、徐小平等等为代表的天使投资人在中国迅速崛起,“超级天使”现象惹人注目。

天使已经逐步向后走。近两年披露的多个TMT案子中,均有天使投资人的身影。

“从我们凯鹏华盈来说,我们主要做早期项目,我个人是做TMT的投资,我个人感受最深的可能是目前超级天使的崛起在中国,这跟美国是非常相像的,美国从前年到去年是一个非常明显的崛起。中国在这个节奏上完全没有落后于美国,几乎在同时,大概就差半年的时间,中国的超级天使就崛起了,从李开复的创新工程到雷军的一些投资机构,我们看到很多超级天使的崛起。”凯鹏华盈主管合伙人周炜在日前举行的2011年ChinaVenture中国投资年会上如是说。

周炜说,“我觉得这个对VC来说,尤其是早期VC的本质是投很早期的公司,从我们来说,我们并不是很关注公开市场和后期会怎么样,但是超级天使的崛起跟我们早期VC这个生态在未来几年怎么变化,这是非常有意思的现象,我们要去观察。但是我也看到超级天使机构化已经出现,像李开复的这个天使已经融到一个比较大的美元基金,据我所知,雷军的基金规模也不小了,所以他们也会变成早期VC,今后三年后,对科技机构的投资会是一个非常有意思的现象。”

VC++网络编程 篇12

随着计算机技术和现代通信技术的发展,人类已经步入以数字化和网络化为特征的知识经济时代。传统的通信模式如电话线路其成本高而且可视化的程度不如网络通信。随着网络的普及,网络通信的优势已经逐步显现,将成为未来人们通信的一种重要的方式[1]。

VC++6.0是一种面向对象的计算机程序设计语言,其界面友好,功能强大,可移植性好,广泛应用于各个行业,它既支持面向过程的程序设计,也支持面向对象的程序设计,适合大中小型的项目开发,因此本系统采用VC++6.0进行开发设计[2]。

利用VC++6.0的MFC设计网络通信,已经成为一种主流的设计方案,伴随着以太网的逐步发展,基于VC++6.0的网络通信可以有助于人们之间的信息交互,在未来的发展中将会得以进一步的成熟和完善。

1 软件系统总体设计流程

网络通信是人与人之间通过网络资源进行信息交流与传递。局域网中最常用的有3个网络协议:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和交叉平台TCP/IP,由于只有TCP/IP允许与Internet完全地连接,所以本系统采用TCP/IP协议[3]。

在通信的过程中,位于局域网中的客户端可以与IP网络相连,通过VC++6.0内置的IP控件实现端与端之间的信息交互。网络整体架构如图1所示。

本系统包括即时通信模块和文件传输模块。采用基于对话框的MFC设计,基于事件触发的思想,界面设计包括基于VC的网络通信设计总界面、私聊界面和用户设置界面,其中总界面通过按键可以实现选择文件传送还是聊天功能,这些功能通过手动触发实现。系统总体设计流程如图2所示[4]。

2 系统设计思想

2.1 聊天功能设计思想

本系统设计的聊天功能主要是基于UDP协议的通信,采用Socket接口,所谓Socket通常也称作“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话,是TCP/IP网络的API[5]。

Socket有流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式Socket是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。在本系统中采用基于UDP的数据报式Socket。下面简要分析两者的优缺点[6]。

TCP协议基于三次握手机制,可以保证数据的安全性,顺序进行数据传输,但是TCP必须创建并且保持一个连接,这给系统增加了开销,而UDP协议尽最大可能进行保温传送,所以有效性远远不如UDP协议,因此一般的即时通信中都采用UDP协议,本系统采用了基于UDP协议设计聊天程序[7]。

聊天的创建程序如下:

wVersoinRequested = MAKEWORD(1,1);

m_socket=socket(AF_INET,SOCK_DGRAM,0); //创建一个UDP套接字

if(INVALID_SOCKET==m_socket)

{

MessageBox(″套接字创建失败!″);

return FALSE;

}

retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)); //绑定

if(SOCKET_ERROR==retval)

{

closesocket(m_socket);

MessageBox(″绑定失败!″);

return FALSE;

}

2.2 文件传输功能设计思想

文件传输协议是一个用于不同的主机之间进行文件传送的协议标准,用来实现文件之间的共享、鼓励间接或者隐式地使用远程计算机、向用户屏蔽不同主机中各种文件存储系统的细节和进行可靠及高效地传输数据。在本系统的设计中采用TCP协议实现了文件的可靠传输与不同主机之间的资源共享[8]。

FTP有主动和被动两种模式。主动模式下有客户端和服务器端,并要求二者同时打开并监听端口,是一种面向连接的传输;被动模式下只要求服务器产生意见监听端口的进程,这样程序的运行就可以绕过防火墙。所以在本设计中采用了被动模式[9]。

文件传输的主程序设计如下:

IPselect=m_listIP.GetItemText(n,0); //获取选中的IP

CFileDialog fileDlg(TRUE); //文件对话框为打开

if(IDOK == fileDlg.DoModal()) //如果按确定按钮

{

CString filename=fileDlg.GetFileName();

CFile fileOpen;

if(!fileOpen.Open(fileDlg.GetPathName(),CFile::modeRead | CFile::typeBinary))

{

AfxMessageBox(″无法打开文件″, MB_OK | MB_ICONERROR);

return;

}

int len=fileOpen.GetLength();

char* data = new char[len];

fileOpen.Read(data,len); //读入文件内容

char *cc=new char[10000];

memset(cc,0,10000);

sprintf(cc,″%d%s%s%d%s%d%s%s%s″,strlen(IPselect),″文件″,IPselect,len,″@″,

filename.GetLength(),″@″,filename,data);

senddata(cc);

fileOpen.Close();

MessageBox(″文件发送完成!″);

}

3 各功能模块的设计

系统的界面分为总界面设计,私聊界面和用户设置界面三大部分,三部分分别执行相应的功能,下面逐步进行介绍。

3.1 总界面设计

该模块是整个系统的基础模块,它负责初始化整个应用程序,首先初始化套接字,并接收和发送各种消息信息,然后根据收到的信息进行判断该执行什么功能,进而建立应用进程。在该界面的设计当中为了使用户方便进行操作,建立了一个包含用户的IP地址和主机名的IP地址列表。在该界面的右侧是群聊窗口可以向所有的用户发送数据,并接收其他用户发来的消息。

为了方便用户操作,最右侧是一个该系统的介绍,最下面的几个按钮是方便用户进行功能选择所建立的,从而使该系统看起来比较直观。

3.2 用户设置界面设计

在该系统的通信过程中,如果靠记忆用户的IP地址来进行通信,容易使人烦躁,所以增加这个模块,来使该系统更加地人性化。在软件的使用中可以先进行通信获得其他用户的信息后,点击设置按钮来更改主机名,也可以修改自己的主机名。通过这两种方式可以让用户更加自主地设计主机名,并且方便用户识别自己的信息。

在该界面中包含自己的IP地址、所在的IP网段和主机名三部分,用户可以自主修改。修改后在主界面中就会显示用户信息了。

3.3 私聊界面设计

该模块可以和指定的用户进行聊天。可以通过选中IP列表中的用户信息单击进行私聊,但是用户不能和自己进行聊天,聊天的内容不会被其他用户看到。

在该程序设计中,应用了UDP协议,界面中安置了三个按钮:清空、发送、关闭,从而方便用户进行操作。该系统运行时,当一方退出程序,就会通知另一方,并把聊天记录存于指定的文本中,如果该文本已经存在,则把聊天记录插到该文本的后面,并保存该记录,方便用户日后进行查看。

3.4 刷新模块设计

该模块可以手动进行刷新用户信息,可以解决网络不同步带来的IP地址列表不能及时更新的问题,单击刷新按钮,系统会清空自己的IP地址列表,并向局域网发送自己的IP主机名和地址信息,其他用户收到后会恢复自己的IP地址和主机名,然后系统会更新自己的IP列表,从而达到网络的同步功能[10]。

3.5 发送文件模块设计

该模块可以向指定的用户发送文本文件。用户可以选中IP列表中的用户,单击发送文件按钮,把要发送的文本文件发送给指定的用户,对方接收后,会提示进行保存处理。

4 系统功能测试

私聊界面可以通过点击私聊开启,当编写完要发送的数据时点击发送即可,点击关闭按钮会弹出提示框,询问用户是否要退出该进程,如图3所示。

文件传送功能的使用,首先选择完用户后,单击文件传送,会弹出如图4所示的界面要求用户选择要传送的文件,在接收端,则要求用户选择存放的位置。

颜色的设定,由于不同的人有不同的喜好,所以增加该模块来方便用户设置背景颜色,如图5所示。

5 结 语

本文给出了一种基于UDP和FTP协议的网络通信设计方案,实现了基于UDP的即时通信和基于FTP协议的文件传输。本设计最大的优点是操作直观,可靠性高,文件传送中几乎不会发生数据的丢失。其主要缺点是没能实现视频的通信,其功能还不够全面,但是在一些小型的局域网中,由于其占用内存少且无需安装,因而有广泛的实际应用价值。

参考文献

[1]马丹.即时通信系统终端的设计与实现[D].成都:电子科技大学,2004.

[2]熊华胜,边信黔.VC++6.0环境下实现基于UDP协议的异步广播通信[J].应用科技,2004,31(2):44-46.

[3]中国教育和科研计算机网.网络协议TCP/IP、IPX/SPX、NETBEUI简介[EB/OL].[1994-01-11].http://www.edu.cn/20010830/210056.shtml.

[4]胡春安,胡中栋.MFC中对话框的创建和应用[J].电脑开发与应用,2005(9):58-59.

[5]杨阳,唐波.远程控制软件编程之多用户显示[J].黑客防线,2009(1):110-112.

[6]陈海蕊,郝世选.VC中基于Socket的局域网监控软件[J].濮阳职业技术学院学报,2009,22(6):136-138.

[7]宋玥玥,吴刚,杜刚.基于UDP协议的数据传输[J].中国电子商情:通信市场,2010(2):176-179.

[8]张喻平.基于互联网的视频远程回放技术的研究[D].武汉:武汉工业学院,2007.

[9]张承钊.互联网转换网关中FTP-ALG的设计与实现[D].成都:电子科技大学,2006.

上一篇:基础教育中的美术教育下一篇:认识小数