基于UDP协议的飞鸽传书.doc_第1页
基于UDP协议的飞鸽传书.doc_第2页
基于UDP协议的飞鸽传书.doc_第3页
基于UDP协议的飞鸽传书.doc_第4页
基于UDP协议的飞鸽传书.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖北工程学院大学生科研作品立项项目成果 项目名称: 基于TCP/IP协议的飞鸽传书 项目负责人:项目合作者: 所在学院: 专业年级: 计算机科学与技术 湖北工程学院新技术学院23基于TCP/IP协议的飞鸽传书摘要:当今,是一个信息高度发达的时代,计算机无疑已经成为网络通信的主角,生活节奏的加快,使得人们对通信速度的要求越来越高。对于在局域网内的计算机之间的数据交互,尤其是文件传输,通常,人们习惯于通过借助于移动存储介质,采取重复拷贝的方式来实现。这种传统文件传输方式存在诸多缺点,比如:消耗时间长,反复拔插存储介质过程繁琐;文件交互频繁,加速了计算机病毒的传播;虽然可以通过操作系统实现在局域网内的数据共享,但终因操作困难而使人们望而却步。关键词:Internet、TCP/IP、局域网、传输、Microsoft Visual C+ 6.0目录1 系统概述11.1 开发背景11.2 开发环境12 系统结构和设计思想12.1 程序设计结构12.2 需要解决的主要技术问题12.3 程序设计思想23 系统分析23.1框架概要设计23.2界面设计33.2 信息传输设计43.3安装程序设计44 系统实现54.1IP Messenge 的文件目录54.2界面实现64.2.1主界面设计(发送界面)64.2.2收到消息界面设计74.2.3准备传送文件界面设计74.2.4文件传送监视界面设计84.2.5.服务界面设计84.2.6.详细/记录 设置 界面设计94.2.7 URL链接界面设计94.2.8 密码界面设计94.2.9自定义离开界面设计104.2.10安装程序界面104.3功能实现114.3.1文件传输114.3.2消息传输114.3.3查找用户124.3.4发送文件134.2.5接收信息144.3.6打开发送文件:144.3.7发送目录文件:154.3.8添加用户列表:195.总结21参考文献221 系统概述1.1 开发背景当今,是一个信息高度发达的时代,计算机无疑已经成为网络通信的主角,生活节奏的加快,使得人们对通信速度的要求越来越高。对于在局域网内的计算机之间的数据交互,尤其是文件传输,通常,人们习惯于通过借助于移动存储介质,采取重复拷贝的方式来实现。这种传统文件传输方式存在诸多缺点,比如:1.消耗时间长,反复拔插存储介质过程繁琐;2.文件交互频繁,加速了计算机病毒的传播;3.虽然可以通过操作系统实现在局域网内的数据共享,但终因操作困难而使人们望而却步。在如此多困难之下,人们不禁会考虑,能不能通过软件来实现计算机之间的数据交互?答案是肯定的。本程序将针对这些问题进行设计。1.2 开发环境飞鸽传书是一款局域网软件,通常采用的开发方法都是面向过程+面向对象的开发方法。这里我们在Microsoft Windows XP 的操作系统用Visual Studio C+进行开发。Visual Studio C+是一种面向对象的开发工具 ,具有组建丰富,功能强大,克移植性强,能够与Windows操作系统无缝结合等优点。使用其开发,速度快,效率高。2 系统结构和设计思想2.1 程序设计结构本程序按照功能可分为两个层:界面层和信息传输层。界面层,主要是各种界面的设计,传输层,实现信息文件的传输等等功能。2.2 需要解决的主要技术问题1.提供友好的用户界面2.实现信息收发3.实现文件传输和文件夹传输4.为程序添加系统托盘图标5.保存用户设置信息2.3 程序设计思想1最关键的是局域网用户列表的建立;本程序启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,默认的端口是:2425。广播包内容包含用户名、工作组、主机名、IP等信息;已启动本程序的用户通过2425端口受到此广播包后,就会在自己的用户列表中添加这个用户的用户名、工作组等信息,同时向对方IP发送本机用户的个人信息;从而双方都能建立起用户列表;2刷新用户列表时发送的广播包和启动时差不多,只不过返回的标识信息略有不同;可以做一个小工具,监控2425端口内存流,就能截获刷新和聊天时的信息。3传送聊天信息时同样使用UDP协议;由于UDP协议是无连接协议,传输速度快,但是没有确认机制,是不可靠的协议,需要自己定义返回信息的标志来判断对方是否收到信息;4用户离线时发送一个离线广播包到255.255.255.255,收到此广播包的用户,根据包中的IP地址(也可能是多种判断标志或者包含硬件标识,比如网卡地址等)删除对方的用户列表信息;5广域网无法直接使用广播方式,靠手工添加“局域网外广播列表”来建立相互的关系;6传送文件是使用TCP协议,端口2425;7使用的加密算法:RSA、Blowfish、RC。3 系统分析3.1框架概要设计模块划分界面设计信息传输安装程序3.2界面设计界面编号界面名称功能实现1Send Message主界面,实现信息发送,文件发送,在线用户、工作组、主机名的查看功能2Receive Message接收消息界面,实现消息的接收,可以查看发送者、发送时间以及回复。3Download Accept Files准备传送文件界面,可以添加删除文件、文件夹,实现文件的传送功能。4Download status monitor文件传送监视界面,实现发送文件的管理。可以查看传送文件的大小,文件总数,传送完成数,传送文件数,传送到的用户,还可以实现传送文件的删除。5IP Messenger Settings服务设置界面实现各种服务的设置。可以设置用户名、工作组、接收、发送/发送选项调整,局域网外广播地址设置等等功能6Details & Log Settings详细/记录设置界面实现详细记录细节的设计。可以实现热键、回复、离开时的消息设置;提示声音,上线,离线图标;通信记录设置等等7Clickable URL SettingsURL链接界面设置URL的链接。指定打开相应链接的程序、协议等等。8Password Settings密码设计界面实现密码的设计。可以修改密码,保护个人隐私。9Absence Setting自定义离开界面实现离开的功能自定义。多种状态进行选择,可以自由设定自动回复的内容。10IP Messenger Setup安装界面实现系统的安装。具体功能见安装程序。3.2 信息传输设计信息传输对应的功能有消息的传输模块,可以理解为聊天模式;文件传输模块,可以远程传输文件或文件夹。信息传输消息传输模块文件传输模块发送消息接收文件接收消息发送文件3.3安装程序设计编号功能1安装指定目录2在指定目录打开程序3卸载程序4设置开机启动5设置注册用户组6创建桌面快捷方式4 系统实现4.1IP Messenge 的文件目录IP Messenger的SRC目录内容描述在列表1.2,SRC目录及主要文件。属性名称描述目录INSTALL安装程序源代码目录文件BLOWFISH.CPP加密算法源文件BLOWFISH.H加密算法头文件BLOWFISH.H2加密算法随机数头文件CFG.CPP系统配置源文件IPMSG.CPPIPMSG的APP源文件IPMSG.HIPMSG头文件LOGDLG.CPP日志DLG源文件LOGMNG.CPP日志处理源文件MAINWIN.CPPIP Messenger主窗口源文件MISCDLG.CPP消息DLG,关于DLG,以及控件子类化等源文件MSGMNG.CPPSocket管理源文件PLUGIN.CPPDll plugin加载源文件RECVDLG.CPP接收消息处理源文件SENDDLG.CPP发送消息处理源文件SETUPDLG.CPPIP Messenger属性配置源文件SHARE.CPP文件传输接收管理源文件TAPP.CPP应用程序类源文件TDLG.CPPDLG类源文件TLIST.CPP链表类源文件TREGIST.CPP注册表操作类源文件TWIN.CPP窗口类源文件MSGSTR.H字符串常量头文件TLIB.H类、结构等头文件另外在SRC目录下,还有一个INSTALL目录,该目录中的文件是IP Messenger安装程序的源代码,其主要文件描述在列表 INSTALL目录主要文件。列表1 INSTALL目录主要文件属性名称描述文件INSTALL.CPP安装程序源文件INSTALL.H安装程序头文件以上是IP Messenger的主要目录及其主要源文件的描述,通过列表我们可以清晰看出IP Messenger的功能分布。在以下的详细分析中,我们主要围绕着这些源文件而展开。4.2界面实现4.2.1主界面设计(发送界面)4.2.2收到消息界面设计4.2.3准备传送文件界面设计4.2.4文件传送监视界面设计4.2.5.服务界面设计4.2.6.详细/记录 设置 界面设计4.2.7 URL链接界面设计4.2.8 密码界面设计4.2.9自定义离开界面设计4.2.10安装程序界面4.3功能实现4.3.1文件传输reg.GetInt(VIEWMAX_STR, &ViewMax);if (ViewMax 1024 * 1024)ViewMax = IPMSG_DEFAULT_VIEWMAX;reg.GetInt(TRANSMAX_STR, &TransMax);if (TransMax 8 * 1024)TransMax = IPMSG_DEFAULT_TRANSMAX;reg.GetInt(TCPBUFMAX_STR, &TcpbufMax);if (TcpbufMax 8 * 1024)TcpbufMax = IPMSG_DEFAULT_TCPBUFMAX;4.3.2消息传输typedef char MaxBufMAX_PATH;AbsenceStr = new MaxBufAbsenceMax;memset(AbsenceStr, 0, MAX_PATH * AbsenceMax);reg.GetStr(ABSENCESTR_STR, AbsenceStr0, sizeof(AbsenceStr0);typedef char MaxHeadMAX_NAMEBUF;AbsenceHead = new MaxHeadAbsenceMax;memset(AbsenceHead, 0, MAX_NAMEBUF * AbsenceMax);if (reg.CreateKey(ABSENCESTR_STR)for (int cnt=0; cnt AbsenceMax; cnt+)charkeyMAX_PATH;wsprintf(key, %s%d, ABSENCESTR_STR, cnt);if (reg.GetStr(key, AbsenceStrcnt, sizeof(AbsenceStrcnt) != TRUE)strncpyz(AbsenceStrcnt, DefaultAbsencecnt IPMSG_DEFAULT_ABSENCEMAX ? cnt : 0, MAX_PATH);wsprintf(key, %s%d, ABSENCEHEAD_STR, cnt);if (reg.GetStr(key, AbsenceHeadcnt, sizeof(AbsenceHeadcnt) != TRUE)strcpy(AbsenceHeadcnt, DefaultAbsenceHeadcnt IPMSG_DEFAULT_ABSENCEMAX ? cnt : 0);reg.CloseKey();4.3.3查找用户typedef char MaxFindMAX_NAMEBUF;if (reg.CreateKey(FINDSTR_STR)reg.GetInt(FINDMAX_STR, &FindMax);reg.GetInt(FINDALL_STR, &FindAll);FindStr = new MaxFindFindMax;for (int cnt=0; cnt ipmsg_len & strncmpi(dest + dest_len - ipmsg_len, IPMSG_EXENAME, ipmsg_len) = 0) ret = :DeleteFile(path);if (remove_path != NULL)strcpy(remove_path, path); while (:FindNextFile(fh, &data);:FindClose(fh);returnret;4.2.5接收信息BOOL LogMng:WriteRecvMsg(MsgBuf *msg, THosts *hosts, ShareInfo *shareInfo)if (msg-command & IPMSG_NOLOGOPT)returnFALSE;WriteStart();charbufMAX_PATH = From: ;MakeListString(cfg, &msg-hostSub, hosts, buf + strlen(buf);strcat(buf, rn);Write(buf);returnWriteMsg(msg-msgBuf, msg-command, shareInfo);4.3.6打开发送文件:BOOL TMainWin:OpenSendFile(const char *fname, SendFileObj *obj)DWORDlowSize, highSize, viewSize;if (obj-hFile = :CreateFile(fname, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) != INVALID_HANDLE_VALUE)lowSize = :GetFileSize(obj-hFile, &highSize);if (obj-fileSize = (_int64)highSize hMap = :CreateFileMapping(obj-hFile, 0, PAGE_READONLY, highSize, lowSize, 0);viewSize = (int)(obj-fileSize cfg-ViewMax ? cfg-ViewMax : obj-fileSize);highSize = (int)(obj-offset 32);lowSize = (int)(obj-offset / cfg-ViewMax) * cfg-ViewMax);obj-mapAddr = (char *):MapViewOfFile(obj-hMap, FILE_MAP_READ, highSize, lowSize, viewSize);if (obj-mapAddr & IsBadReadPtr(obj-mapAddr, 1)CloseSendFile(obj);returnFALSE;returnobj-mapAddr ? TRUE : FALSE;4.3.7发送目录文件:BOOL TMainWin:SendDirFile(SendFileObj *obj)BOOLfind = FALSE;if (obj-status = FS_OPENINFO)charbufMAX_BUF;if (obj-dirCnt = 0)strncpyz(buf, obj-fileInfo-Fname(), MAX_PATH);else if (MakePath(buf, obj-path, *obj-fdata.cAlternateFileName ? obj-fdata.cAlternateFileName : obj-fdata.cFileName) = MAX_PATH)returnFALSE;strncpyz(obj-path, buf, MAX_PATH);obj-dirCnt+;obj-status = FS_FIRSTINFO;if (obj-status = FS_FIRSTINFO | obj-status = FS_NEXTINFO)if (obj-status = FS_FIRSTINFO)charbufMAX_BUF;MakePath(buf, obj-path, *);find = (obj-hDirobj-dirCnt -1 = :FindFirstFile(buf, &obj-fdata) = INVALID_HANDLE_VALUE ? FALSE : TRUE;else find = :FindNextFile(obj-hDirobj-dirCnt -1, &obj-fdata);while (find & (strcmp(obj-fdata.cFileName, .) = 0 | strcmp(obj-fdata.cFileName, .) = 0)find = :FindNextFile(obj-hDirobj-dirCnt -1, &obj-fdata);obj-status = FS_MAKEINFO;if (obj-status = FS_DIRFILESTART | obj-status = FS_MAKEINFO)if (obj-status = FS_DIRFILESTART)find = TRUE;if (find & (obj-dirCnt 0 | obj-isDir = FALSE) & (obj-fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) = 0)charbufMAX_BUF;intlen = obj-isDir ? MakePath(buf, obj-path, *obj-fdata.cAlternateFileName ? obj-fdata.cAlternateFileName : obj-fdata.cFileName) : wsprintf(buf, %s, obj-fileInfo-Fname();BOOLmodifyCheck = (cfg-fileTransOpt & FT_STRICTDATE) & *(_int64 *)&obj-fdata.ftLastWriteTime *(_int64 *)&obj-attachTime;if (len = MAX_PATH | modifyCheck | OpenSendFile(buf, obj) = FALSE)len = strlen(obj-fdata.cFileName);strncpyz(obj-fdata.cFileName + len, (Cant open), MAX_PATH - len);obj-fdata.nFileSizeHigh = obj-fdata.nFileSizeLow = 0;if (find = FALSE & obj-isDir)GetFileInfomation(obj-path, &obj-fdata);obj-headerOffset = 0;obj-headerLen = MakeDirHeader(obj, find);if (find = FALSE)if (-obj-dirCnt = 0 & obj-isDir):FindClose(obj-hDirobj-dirCnt);if (PathToDir(obj-path, obj-path) != TRUE & obj-dirCnt 0)returnFALSE;if (obj-dirCnt dirCnt-;obj-status = FS_TRANSINFO;if (obj-status = FS_TRANSINFO)intsize = :send(obj-conInfo-sd, obj-header + obj-headerOffset, obj-headerLen - obj-headerOffset, 0);if (size headerOffset += size) headerLen)returnTRUE;obj-status = obj-dirCnt fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? FS_OPENINFO : FS_TRANSFILE;if (obj-status = FS_TRANSFILE)if (obj-mapAddr & SendFile(obj) != TRUE)CloseSendFile(obj);returnFALSE;else if (obj-mapAddr = NULL | obj-status = FS_ENDFILE)CloseSendFile(obj);obj-status = obj-isDir ? FS_NEXTINFO : FS_MAKEINFO;returnTRUE;4.3.8添加用户列表:void TMainWin:AddHostList(MsgBuf *msg)char*tok, *nickName, *groupName, *p;HostSubhostSub;ULONGhost_status;inttotal_num, continue_cnt;if (tok = separate_token(msg-msgBuf, HOSTLIST_SEPARATOR, &p) = NULL)return;continue_cnt = atoi(tok);if (tok = separate_token(NULL, HOSTLIST_SEPARATOR, &p) = NULL)return;total_num = atoi(tok);for (int host_cnt=0; (tok = separate_token(NULL, HOSTLIST_SEPARATOR, &p) != NULL; host_cnt+)nickName = groupName = NULL;strncpyz(hostSub.userName, tok, sizeof(hostSub.userName);if (tok = separate_token(NULL, HOSTLIST_SEPARATOR, &p) = NULL)break;strncpyz(hostSub.hostName, tok, sizeof(hostSub.hostName);if (tok = separate_token(NULL, HOSTLIST_SEPARATOR, &p) = NULL)break;host_status = GET_OPT(atol(tok);if (tok = separate_token(NULL, HOSTLIST_SEPARATOR, &p) = NULL)break;hostSub.addr = inet_addr(tok);if (tok = separate_token(NULL, HOSTLIST_SEPARATOR, &p) = NULL)break;hostSub.portNo = atoi(tok);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论