




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验总成绩: 装 订 线报告份数: 学院 通信与信息工程学院 课程设计报告专业班级: 学生姓名: 学号(班内序号): 年 月日基于指纹仪和读卡器的程序设计一、实验目的:本次课程设计通过使用指纹仪和读卡器开发包,掌握一般软件包和开发库的基本使用方法。通过对仪器和开发包的理解和使用结合信息安全技术实验中的掌握的网络开发技术,自行选择至少一种设备并设计一个相关的应用题目并实现连远程的数据库和服务器。二、实验时间与实验地点:时间:第5-6周 上午:9-17点指导老师:刘意先三、实验环境:PC机一台,Windows,两台读卡器四、程序编写语言:程序编写环境:VC+6.0数据库建立环境:mysql文件传输环境:winsock五、实验任务与要求:实现一个受身份认证控制的网络文件传输应用程序,双方开启应用程序,一方向另一方要求发送文件包前,双方必须刷卡将信息发往对方进行验证,双方都验证通过则允许发送文件。六、实验原理:1、读卡器:读卡器(Reader)是一种专用设备。有插槽可以插入存储卡,有端口可以联接到计算机。把适合的存储卡插入插槽,端口与计算机相连并安装所需的驱动程序之后,计算机就把存储卡当作一个可移动存储器,从而可以通过读卡器读写存储卡。按所兼容存储卡的种类分可以分为CF卡读卡器、SM卡读卡器、PCMICA卡读卡器以及记忆棒读写器等,还有双槽读卡器可以同时使用两种或两种以上的卡;按端口类型分可分为串行口读卡器(速度很慢,极少见)、并行口读卡器(适合于早期主板的计算机)、USB读卡器(速度快,使用方便)。2、实现带有用户身份验证的文件传输WebService一、 理解Web Service 首先让我们简单理解一下Web Service。 Web services 实际上是基于XML的针对商业、应用程序的系统服务。实际上是建立在一系列已有的技术基础上的一个新的概念。使用它如同使用RPC(远程过程调用),不过它提供的接口是基于对象的。它与原有的组件模型,如com/dcom,corba,rmi等,最大的特点就是标准化(基于XML的一系列标准)带来的跨平台的通用性,基于http带来的畅通无阻的能力(跨越防火墙),对于Dot Net来说,配合Visual Studio.Net其中的Web Service还具有易用性的特点。用户即便不懂那些相关标准,只要会面向对象变成,对Web Service有个初步的了解就可以动手写Web Service了。 如何建立一个Web service呢?下面的技术步骤获得了工业界普遍认同。 1.服务提供者建立、组织和发布网络服务。它的手段是多样的,可以使用编程语言(例如Delphi,Java,C#等)、中间件或其它特殊平台来完成。 2.服务提供者用WSDL (the Web Services Description Language )来提供服务描述。. WSDL文档向第三方提供服务描述。 3.服务提供者向UDDI (Universal Description, Discovery, and Integration ) 注册表注册网络服务。UDDI使得开发者发布服务并且可以通过软件搜索其它人提供的服务。 用户将通过搜索UDDI 注册表来搜索服务。 4. 客户端应用程序通过和网络服务绑定并且通过SOAP (the Simple Object Access Protocol )来激活网络服务相应的操作。SOAP 提供XML格式的参数和返回结果,并利用HTTP传送。所有网络服务都通过SOAP通讯。 上面的第一步是核心,它决定了你的Web Service的用途和接口。第二步在Visual Studio.Net中被自动完成,大家当然也可以用WSDL.exe手动生成。第四步在客户端编程时Visual Studio提供了最大的便利。用户只要使用” Add Web Service Reference”或者“添加Web服务引用”(中文版),敲入网址,Visual Studio.Net就会自动生成调用Web Service的类,底层的SOAP对用户完全透明。 但是,当用户需要考虑安全性时就不得不考虑一下soap了。记住,安全性是将来必须考虑的,在将来软件开发变为配置集成,软件产品变为服务,购买软件变为租用软件,大部分服务都基于网络时,你可能得考虑谁可以用你的服务,谁不可以用你的服务了,当然,我也比较赞同开放源代码和公开交流技术,我把自己辛苦钻研出来的东西写出来也表明了我的态度。但是,毕竟,我们还是要靠写软件吃饭的:) 在web service中,用户名,密码可以通过soap头(soap header)进行传送。在web service的编写中,需要对soap头进行处理,不过这也不太难,大家认识到这一点然后看我下面的例子就可以学会如何利用它了。二、 代码实现 首先,我们实现一个用于身份验证的类,文件名Authentication.cs为代码如下: using System; namespace useResData / /实现带有用户身份验证的文件传输Web Service / public class Authentication: System.Web.Services.Protocols.SoapHeader public string Username; public string Password; public Boolean ValidUser(string in_Username, string in_Password) if(in_Username = caomo) & (in_Password = password) return true; else return false; public Authentication() / / TODO: Add constructor logic here / Authentication类继承自System.Web.Services.Protocols.SoapHeader。且定义了两个成员变量,Username和Password,还定义了一个用户认证的函数ValidUser。它提供了对Username和Password检查的功能,你可以把它写得很复杂,诸如通过访问数据库来检查用户的有效性。我在这里只是简单检查了固定值的相等性。/* WinSock实现网络文件传输程序* Windows 2003 + Visual C+ 6.0 编译通过* brick 2007.4.1*/#pragma comment(lib, ws2_32.lib)#include#include#include#include#include#define CHARLENGTH 80 /字符串长/#define SEND_BUFFER_SIZE 1024 /发送缓冲区/#define RECV_BUFFER_SIZE 1024 /接收缓冲区/#define PORT 8508 /默认端口/#define TRUE 1#define FALSE 0enum CMD_NAME;int RecvFile(); /接收int SendFile(); /发送int usage(char msg); /帮助提示int main(int argc, char *argv) char operateCHARLENGTH; memset(operate, 0, sizeof(operate); usage(argvCMD_NAME); while (printf(nn) & printf(请输入参数 : ) & scanf(n%s, operate) != EOF) if (strlen(operate) 2 ) usage(argvCMD_NAME); continue; switch (operate1) case r: RecvFile(); break; case s: SendFile(); break; case q: printf(谢谢使用 %snByeBye!nn, argvCMD_NAME); return(0); break; default : usage(argvCMD_NAME); break; return(0);/接收函数int RecvFile() char filePathCHARLENGTH; printf(请输入保存文件的绝对路径 :n); /获取文件保存路径/ memset(&filePath, 0, sizeof(filePath); scanf(n%s, filePath); WSADATA wsaData; WSAStartup(WINSOCK_VERSION, &wsaData); /建立连接/ / SOCKET sockrecv = socket(AF_INET, SOCK_STREAM, 0); /创建套接字/ if (sockrecv 0) closesocket(sockrecv); WSACleanup(); perror(sock); printf(警告: 创建套接字失败!n); return(FALSE); SOCKADDR_IN addrSrv; memset(&addrSrv, 0, sizeof(addrSrv); addrSrv.sin_family = AF_INET; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); /填充本地ip/ addrSrv.sin_port = htons(PORT); /填充默认端口/ int ret1 = bind(sockrecv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR); /绑定套接字/ if (ret1 0) closesocket(sockrecv); WSACleanup(); perror(bind); printf(警告: 绑定失败!n); return(FALSE); printf(等待连接.); int ret2 = listen(sockrecv, 5); /开始监听,限制5个连接/if (ret2 0) closesocket(sockrecv); WSACleanup(); perror(listen); printf(警告: 监听失败!n); return(FALSE); SOCKADDR_IN addrCli; memset(&addrCli, 0, sizeof(addrCli); int len = sizeof(SOCKADDR); SOCKET sockCli=accept(sockrecv, (SOCKADDR*)&addrCli, &len); /开始接收/ if(sockCli 0) closesocket(sockrecv); WSACleanup(); perror(accept); printf(警告: 接收失败!n); return(FALSE);printf(已经连接 %sn, inet_ntoa(addrCli.sin_addr); /显示连接端信息/ int fileLength, cbBytesRet, cbLeftToRecv; BYTE* recvData = NULL; /创建文件/ HANDLE hFile; hFile = CreateFile( filePath, /string 文件名或者绝对路径 GENERIC_WRITE, /long 读写权限,如果为零,表示只允许获取与一个设备有关的信息 FILE_SHARE_WRITE, /long 零表示不共享,FILE_SHARE_READ 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问 NULL, /指向SECURITY_ATTRIBUTES结构的指针,判定返回的句柄是否可以被子进程继承,定义了文件的安全特性,用null表示不被继承。 OPEN_ALWAYS, /long 创建文件,如文件存在则会出错 0, /long 文件默认属性 NULL); /long 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性 assert(hFile & CreateFile!);/*FILE* hFile;hFile = fopen(filePath, wb);*/ printf(正在接收文件.n); /首先接收文件长度信息/ cbLeftToRecv = sizeof(fileLength); do BYTE* bp = (BYTE*)(&fileLength) + sizeof(fileLength) - cbLeftToRecv; cbBytesRet = recv(sockCli, (char*)bp, cbLeftToRecv, 0); /流型数据的接收处理/ if (cbBytesRet 0); fileLength = ntohl(fileLength); /将文件的长度信息转化为本地字节序/开始接收文件 recvData = new BYTERECV_BUFFER_SIZE; cbLeftToRecv = fileLength;do int iiGet, iiRecv; iiGet = (cbLeftToRecv RECV_BUFFER_SIZE) ? cbLeftToRecv : RECV_BUFFER_SIZE; iiRecv = recv(sockCli, (char*)recvData, iiGet, 0); /流型数据的接收处理/ /printf(cbLeftToRecv %d iiGet %d iiRecv %d sizeof(recvData) %dn, cbLeftToRecv, iiGet, iiRecv, sizeof(recvData); if (iiRecv 0); printf(发送完成.n);/* fclose(hFile); hFile = fopen(filePath, rb); if (hFile !=NULL) /取得文件大小/ fseek(hFile, 0L, SEEK_END); fileLength = ftell(hFile); fseek(hFile, 0L, SEEK_SET); */ /fileLength = GetFileSize(hFile, NULL); /printf(test: 文件长度 %dn, fileLength); /接收结束,释放内存,关闭连接/ PreReturn : delete recvData; CloseHandle(hFile); closesocket(sockrecv); WSACleanup(); return(0);/发送函数int SendFile() char filePathCHARLENGTH; char DST_IPCHARLENGTH; DWORD dst_ip; printf(请输入目的IP地址 :n); memset(&DST_IP, 0, sizeof(DST_IP); scanf(n%s, DST_IP); printf(请输入待发送文件的绝对地址 :n); scanf(n%s, filePath); WSADATA wsaData; WSAStartup(WINSOCK_VERSION, &wsaData); dst_ip = inet_addr(DST_IP); /取得目的ip/ /建立连接/ SOCKET socksend = socket(AF_INET, SOCK_STREAM, 0); /创建套接字/ if (socksend 0) closesocket(socksend); WSACleanup(); perror(socket); printf(警告: 创建套接字失败!n); return(FALSE); SOCKADDR_IN addrSrv; /struct sockaddr_in/ memset(&addrSrv, 0, sizeof(addrSrv); /初始化addr/ addrSrv.sin_family = AF_INET; addrSrv.sin_addr.s_addr = dst_ip; /填充目的ip/ addrSrv.sin_port = htons(PORT); /填充默认端口/ int ret1 = connect(socksend, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR_IN); /连接目的地址/ if (ret1 0) closesocket(socksend); WSACleanup(); perror(connect); printf(警告: 连接失败!n); return(FALSE); int fileLength, cbLeftToSend; BYTE* sendData = NULL; HANDLE hFile; hFile = CreateFile(filePath, /打开要传送的文件/ GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); assert(hFile & CreateFile failed!);/*FILE* hFile;hFile = fopen(filePath, rb); /打开要传送的文件/ if (hFile !=NULL) /取得文件大小/ fseek(hFile, 0L, SEEK_END); fileLength = ftell(hFile); */ fileLength = GetFileSize(hFile, NULL); printf(正在发送文件.n); /首先传送文件长度给接收端/ fileLength = htonl(fileLength); /转化为网络字序/ cbLeftToSend = sizeof(fileLength);/printf(fileLength %d cbLeftToSend %dn, fileLength, cbLeftToSend); do int cbBytesSend; BYTE* bp = (BYTE*)(&fileLength) + sizeof(fileLength) - cbLeftToSend; cbBytesSend = send(socksend, (const char*)bp, cbLeftToSend, 0); if (cbBytesSend 0); /开始发送文件/ sendData = new BYTESEND_BUFFER_SIZE; assert(sendData & Allocate memory failed!); cbLeftToSend = GetFileSize(hFile, NULL); do /循环发送/ int sendThisTime, doneSoFar, buffOffset; DWORD dwLen; sendThisTime = ReadFile(hFile, sendData, SEND_BUFFER_SIZE, &dwLen, NULL); sendThisTime = dwLen;/* memset(sendData, 0, sizeof(sendData); fread(sendData, SEND_BUFFER_SIZE, 1, hFile); sendThisTime = sizeof(sendData); */ buffOffset = 0; /printf(cbLeftToSend %d字节 sendThisTime %d dwLen %dn, cbLeftToSend, sendThisTime, dwLen); do doneSoFar = send(socksend, (const char*)(sendData + buffOffset), sendThisTime, 0); /printf(1 cbLeftToSend %d sendThisTime %d buffOffset %d doneSoFar %dn, cbLeftToSend, sendThisTime, buffOffset, doneSoFar); if (doneSoFar 0); while (cbLeftToSend 0); printf(发送完成.n); /发送结束,释放内存,关闭连接/ PreReturn : delete sendData; closesocket(socksend); WSACleanup(); return(0);int usage(char msg) return(TRUE);3、数据库:创建数据库:创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name=databaseName) drop database databaseName go Create DATABASE database-name 删除数据库:drop database dbname 备份sql server:- 创建备份数据的 device USE master EXEC sp_addumpdevice disk, testBack, c:mssql7backupMyNwind_1.dat - 开始备份 BACKUP DATABASE pubs TO testBack 创建新表:create table tabname(col1 type1 not null primary key,col2 type2 not null,.) 根据已有的表创建新表: A:go use 原数据库名 go select * into 目的数据库名.dbo.目的表名 from 原表名(使用旧表创建新表) B:create table tab_new as select col1,col2 from tab_old definition only 创建序列:create sequence SIMON_SEQUENCE minvalue 1 - 最小值 maxvalue 999999999999999999999999999 - 最大值 start with 1 - 开始值 increment by 1 - 每次加几 cache 20; 删除新表:drop table tabname 增加一个列Alter table tabname add colname coltype 删除一个列:Alter table tabname drop column colname 添加主键:Alter table tabname add primary key(col) 说明:删除主键:Alter table tabname drop primary key(col) 创建索引:create unique index idxname on tabname(col。) 删除索引:drop index idxname on tabname 注:索引是不可更改的,想更改必须删除重新建。 创建视图:create view viewname as select statement 删除视图:drop view viewname七、实验步骤:(1)安装读卡器:1.打开Driver文件夹,阅读“驱动程序安装说明.txt”安装USB口驱动。2.安装URF35-LT.EXE开发套件。API读写器开发动态库APIManualAPI开发手册Demo读写器操作演示DemoExamples开发演示样例该型号读写器需要安装USB驱动程序才能正常使用,该驱动程序位于安装目录下的Driver Setup文件夹中。安装流程: 在win2000及以上的操作系统中,请先不要连接读写器,安装过程中,会弹出提示框,提示要连接“USB CDC Device”设备,这时候连接上读写器,按“确认”按钮,在系统辨认到读写器后,取消掉windows系统弹出的“安装新硬件”的提示框,等一段时间后,安装程序会自动完成,并提示要重新启动windows,重新启动后可以正常使用读写器。 在win98/ME操作系统中,请先安装驱动程序,安装完成之后,关闭计算机,然后连接读写器,然后重新启动windows,在系统辨认到读写器后,可以正常使用。注意:如果您使用的操作系统是WINDOWS XP SP2,而且已经安装过旧的V1.0版本的驱动程序,需要按照以下步骤卸载:1。连接上读写器,在设备管理器里面对设备按鼠标右键选择“卸载”;2。拔下读写器,在控制面板里面卸载“9720 Driver”选项;3。重新启动计算机;4。按上面所述的流程安装新的驱动程序。(2)编写程序;(3)程序调试;(4)程序运行;八、实验程序:服务器:#include #include #include #include#include#include#include#include #include #pragma comment(lib , Wsock32.lib ) #pragma comment( lib, libmysql.lib)using namespace std;int usern=1;int main()printf(*文件传输系统 身份验证服务器端*nn);WSADATA wsaData; if(WSAStartup(0x101,&wsaData) printf(初始化错误n); return 1; SOCKET sockSrv; sockSrv=socket(AF_INET,SOCK_STREAM,0);if(sockSrv = SOCKET_ERROR) printf(建立套接字错误n); return 2; SOCKADDR_IN addrSrv; addrSrv.sin_addr.s_addr=inet_addr(); addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(8888); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);listen(sockSrv,1);printf(-成功建立监听-n);SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1)SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char recvBuf50;recv(sockConn,recvBuf,50,0);if(strcmp(recvBuf,OK)=0) printf(连接成功!n);printf(*身份验证执行中.*n);ed: recv(sockConn,recvBuf,50,0);printf(验证登陆者身份.n); MYSQL li; int res; mysql_init(&li); if (mysql_real_connect(&li, localhost, root, 123,wangrong,3306,NULL,CLIENT_FOUND_ROWS) printf(数据库连接成功!nnn); string id(recvBuf,recvBuf+strlen(recvBuf); string s_sql=select * from mytable where id = +id+; if(mysql_query(&li,s_sql.c_str() != 0) mysql_close(&li); /执行SQL语句出错 std:cout数据库语法错误!n endlmysql_error(&li)endl; return -1; MYSQL_RES *result = mysql_store_result(&li); int rowcount = mysql_num_rows(result); /取得查询结果 if(rowcount=NULL) printf(你是那位?n); MYSQL_FIELD *fields = NULL; MYSQL_ROW currrow = NULL;/依次读取各条记录 while(currrow = mysql_fetch_row(result) != NULL) for(int j=0;j!=3;+j) if(j=1) char *a=currrowj; printf(%s同学已成功登录,以下是他的个人信息:n,a); time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); printf(签到时间:%snnn,asctime (timeinfo); send(sockConn,a,strlen(a)+1,0); printf(卡号 姓名 学号n); for(int k=0;k3;k+) std:cout(currrowk ? currrowk: NULL)t; std:coutendlendl; /printf(可以传送文件了nnn);/system(D:chuanshuchuanshuSystemexeDebug-ServerServFigo.exe); goto ed; mysql_free_result(result) ; mysql_close(&li); system(pause); return 1;客户端:#include#includemwrf32.h#includestdio.h #include #include #include#pragma comment(lib , Wsock32.lib ) SO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 定安工程潜水铺设方案(3篇)
- 牵牛花的种植课件
- 临床不需要编码手术操作定义及编码规则
- 安全教育平台使用培训会课件
- 山东省济南市2025年中考物理真题附真题答案
- 农业可持续发展与现代种业创新基地建设项目可行性研究报告
- 职工劳动合同样板范本
- 上托管协议的法律要素
- 新能源产业绿色升级:2025年技术创新与环保责任路径报告
- 汽车行业供应链风险管理案例解析与韧性保障报告
- YS/T 3019-2013氰化堆浸提金工艺安全生产技术规范
- GB/T 8948-1994聚氯乙烯人造革
- GB/T 6482-2007凿岩用螺纹连接钎杆
- 小学英语人教PEP六年级上册Unit3Myweekendplan击鼓传花小游戏
- PEP小学英语单词表(3-6年级)
- 2020小学一年级语文上册新教材教材分析解读课件
- DB4401-T 43-2020 反恐怖防范管理+防冲撞设施-(高清现行)
- 教学课件:《新能源材料技术》朱继平
- 专业技术职称与职业(工种)技能人才评价对应表(试行)
- DB37∕T 4328-2021 建筑消防设施维护保养技术规程
- 银行信贷实务与管理课件
评论
0/150
提交评论