目 录
1 文档概述 2
1.1 文档目的和范围 2
1.2 术语/缩略语 2
1.3 参考文档 3
2 模块概述 3
2.1 模块功能定义 3
2.2 模块结构 4
2.3 模块动作时序 4
3 接口说明 4
3.1 数据结构定义 4
3.2 函数 5
3.2.1 模块间接口函数 5
3.2.2 模块内接口函数 7
4 文档概述 22
4.1 文档目的和范围 22
4.2 术语/缩略语 22
4.3 参考文档 23
5 处理 23
5.1 模块数据结构定义 23
5.1.1 全局变量定义 24
5.2 模块功能实现 24
5.2.1 模块间接口函数 24
6 测试项目设计 39
7 项目概要 39
8 项目名称 39
9 项目目标 39
10 开发环境 39
11 关键技术 39
12 开发体制 40
13 软件详细需求 40
14 系统整体设计 44
7项目概要
开发一款运行于Linux操作系统平台的邮件模拟系统,可以实现局域网内任意电脑之间的信息接收与发送,也可作为支持中小型规模的企业内部信息交流。主要功能包括:
(1)有方便实用的邮件登陆界面、收发邮件界面和写邮件界面;
(2)可以实现局域网内任意电脑间的邮件接受与发送。
8项目名称
FlowerMail邮件系统
9项目目标
1.体会从需求理解出发,到软件概要设计,详细设计,编码,测试,发布的整个流程,熟悉软件开发的全部流程;
2.熟悉Linux操作系统下的C应用程序开发环境,掌握linux系统下开发工具vi、gcc 和gdb的使用,本文转载自http://www.biyezuopin.vip/onews.asp?id=15047以及makefile的写法;
3.掌握Linux环境下图形工具包GTK和网络编程中socket“套接字”的使用;
4.练习使用Linux环境下的数据库MySQL;
5.培养快速学习新知识并在项目中灵活使用的能力;
6.培养表达能力、沟通能力和团队合作能力。
10开发环境
操作系统:Ubuntu 9.04
编译调试环境: VI+GCC+GDB
11关键技术
C语言编程
Linux开发环境中开发工具的使用
Gnome图形设计——GTK+2.0
网络编程中socket“套接字”的使用
数据库MySQL的使用
/**************************************************************************************/
/* 著作权所有者 : */
/* 文件名 : LoginModule.c */
/* 内容 : 登录模块的函数 */
/* 作成日期 作者 : */
/* 修正日期 作者 : */
/**************************************************************************************/
#include "../include/LoginModule.h"
#include "../include/mysocket.h"
#include "../include/DataStruct.h"
#include
#include
#include
#include
/***************************************************************************************
* Function Name : CheckLoginInput
*
* Description : 分析用户输入的帐号密码是否合法
*
* Date : 2012-9-6
*
* Parameter : char *pcUserID,char* pcPasswd
*
* Return Code : 0 成功
* 1 帐户密码有非法字符
* 2 密码有非法字符
* 3 密码太短
*
* Author : 张文跃
****************************************************************************************/
int CheckLoginInput(char *pcUserID, char* pcPasswd)
{
int iPasswdLength;
int iUserIdLength;
int i;
iUserIdLength = strlen(pcUserID);
iPasswdLength = strlen(pcPasswd);
char *pUserId = pcUserID;
//遍历分析用户输入的帐号字符
for ( i = 0; i < iUserIdLength; i++)
{
if((pcUserID[i] >= '0' && pcUserID[i] <= '9') || (pcUserID[i] >= 'a' && pcUserID[i] <= 'z') || (pcUserID[i] >= 'A' && pcUserID[i] <= 'Z'))
{
continue;
}
else
return 1; //出错
}
//密码长度判断
if (iPasswdLength < 6 || iPasswdLength > 16)
{
return 2;//密码长度不对
}
return 0;
}
/***************************************************************************************
* Function Name : SendLoginInfoToServer
*
* Description : 1、将命令,帐号,密码连接成数据库字符串
* 2、调用socket函数发送字符串到服务器
*
* Date : 2012-9-7
*
* Parameter : char *pcUserID,char* pcPasswd
*
* Return Code : 0 发送成功
* 1 调用socket失败
*
* Author : 张文跃
****************************************************************************************/
int SendLoginInfoToServer(char *pcUserID, char* pcPasswd)
{
int sendResult;
char buffer[UserIDPasswdLen];
memset(buffer, '\0',UserIDPasswdLen);
char event1[10] = "filefrcli";
char event3[10] = "sqlinsert";
char event2[10] = "sqlupdate";
char event[10] = "sqlselect";
char event4[10] = "filetocli";
sprintf(buffer, "%s|SELECT userId,state FROM UserTable WHERE userId='%s' and passwd='%s'", event, pcUserID, pcPasswd);
isocketfd = connect_socket(SERVERIP, SERVERPORT);
sendResult = send_msg(isocketfd, buffer, UserIDPasswdLen);
if (sendResult == -1)
{
return 1;
}
return 0;
}
/***************************************************************************************
* Function Name : RecvLoginResFromServer
* WHERE userId = '1355' and passwd = 'zld'
* Description : 1、接收服务器返回结果
* 2、根据返回结果判断登录成功与否
* 3、字符流形式'|'一个字段的结束 '~'一条记录的结束 1355|xiaohei|zld|1|123|~
* Date : 2012-9-7
*
* Parameter : char *receBuffer
*
* Return Code : 0 登录成功
* 1 用户名或者密码错误,登录失败
* 2 已经登录,登录失败
* Author : 张文跃
****************************************************************************************/
int RecvLoginResFromServer()
{
int iItemNum = 0; //记录条目数
char cState = ' '; //状态
char cUserId[25]; //存储用户Id
int i = 0;
int j = 0;
char receBuffer[UserIDPasswdLen];
memset(cUserId, '\0', 25);
memset(receBuffer, '\0', UserIDPasswdLen);
recv_msg(isocketfd,receBuffer,UserIDPasswdLen);
//对获取的字符流进行处理
printf("%s\n", receBuffer);
while (receBuffer[i] != '\0')
{
//说明一个字段结束
if (receBuffer[i] == '|' && receBuffer[i + 1] != '~')
{
cState = receBuffer[++i];
}
else if (receBuffer[i] == '|' && receBuffer[i + 1] == '~')
{
++iItemNum;
++i;
}
else
{
cUserId[j] = receBuffer[i];
++j;
}
++i;
}
printf("item:%d\n", iItemNum);
printf("cUserId:%s\n", cUserId);
printf("cState:%c\n", cState);
close_socket(isocketfd);
if (cState == '1')//已经登录过一次
{
return 2;
}
else if (cUserId == "0" && cState == ' ')//用户名或者密码错误
{
return 1;
}
else if (iItemNum != 1 )
{
return 1;
}
else
{
return 0;
}
}
/***************************************************************************************
* Function Name : CreateUserFolder
*
* Description : 1、登录成功后创建接收文件夹(recv),发送文件夹(send),草稿箱(draft)
*
* Date : 2012-9-9
*
* Parameter : char *userId
*
* Return Code : 0 创建成功
*
* Author : 张文跃
****************************************************************************************/
int CreateUserFolder(char *userId)
{
char buffer[80];
char dBuffer[85];
char pBuffer[109];
char rBuffer[113];
char sBuffer[113];
char drBuffer[114];
memset(buffer, '\0', 80);
memset(pBuffer, '\0', 105);
//获取执行程序当前路径
getcwd(buffer, sizeof(buffer));
//data文件夹
sprintf(dBuffer, "%s/data", buffer);
//用户文件夹
sprintf(pBuffer, "%s/%s", dBuffer, userId);
//建用户接收文件夹
sprintf(rBuffer, "%s/recv", pBuffer);
//用户发送文件夹
sprintf(sBuffer, "%s/send", pBuffer);
//用户草稿文件夹
sprintf(drBuffer, "%s/draft", pBuffer);
//创建文件夹
mkdir(dBuffer, 0755);
mkdir(pBuffer, 0755);
mkdir(rBuffer, 0755);
mkdir(sBuffer, 0755);
mkdir(drBuffer, 0755);
return 0;
}