day1
1.开发环境
Linux系统+GCC+FDB+makefile+sqlite3
2.功能描述
项目功能:
服务器:处理客户端的请求,并将数据存入数据库中,客户端请求的数据从数据库进行获取,服务器转发给客户端。
用户客户端:实现账号的注册、登录、注销、修改用户密码功能,当登录成功时可以寄快递、查快递、修改快递信息、取消订单等功能。
快递员客户端:实现账号的注册、登录、注销、修改用户密码功能,当登录成功时可以查快递、送快递、查看历史订单等功能。
- 设计实施
1.Sock编程
启动服务端程序,监听端口,等待客户端连接。完成客户端与服务端的tcp连接。使用I/O复用机制或完成客户端与服务端之间的一对多的连接。服务端记录每个客户端的基本信息:每个客户端的IP、端口等基本信息。
2.数据包协议
客户端使用TCP连接服务端后,发送接受数据使用数据封包。封包格式如下:
|协议版本(1)|数据包类型(1)|数据包的长度(2)|数据包的内容(变长)|
协议版本:发送端填充自己的该数据包的版本信息,服务端接受数据包后,查看该版本是否是自己能识别的版本。是则进行解析,否则作为非法数据包(一般丢弃)。
数据包类型:发送端根据自己发送的数据包里面的数据内容的不同填充不同的类型。
如:如果数据包的数据信息是登录信息,类型为0x0001。如果是断开连接的信息则类型为0x0002。这样接收端接受到数据之后就可以根据数据类型的值,对数据做不同的处理。数据包的长度:TCP是数据流协议,数据发送者多次发送的数据,但在tcp的接受端缓冲区内数据与数据之间没有间隔。无法分开。所以在数据包中增加一项数据长度。这样接收端可以根据数据长度信息确定本数据包的长度,确定要从tcp的缓冲区内每次要读取的长度。数据包内容:要发送的数据。
数据包发送者:在发送数据前,在数据前增加数据包头。数据包头包含以上的包头信息。封包可以采用数据结构:
Struct pack_head
{
Int acceptfd;
Unsigned char type;//消息类型
Unsigned char usertype;//用户类型:1:用户2:快递员
Char name [32];//用户名
Char paaswd [32];//密码
Char buf [32];//调试信息
Struct order_msg msgg;//单号信息
}PACK;
数据包接受端:接受到数据后,分成两次读取一个数据包,第一次读取首先读取一个数据包头长度,然后根据数据包头中的数据长度读取整个数据包。这样一个一个的数据包就分别被读取出来。
数据包协议总结:协议是数据的收发端之间一种约定要好的一种规定。发送者按照该格式发送,接受者按照该格式进行解析。
3.数据管理
服务端接收所有客户端的信息。将所有账号和密码以及快递单信息存在数据库中。同一管理用户信息用户名、密码以及快递单信息。
快递单信息包括:
Struct order_msg
{
Int status;//0:表示未完成订单1:表示已完成订单
Long order;//订单号,由服务器端生成
Char sender[ 32];//发送人
Char send_addr [64];//发送地址
Long send_tel;//发送电话
Char reciver [32];//收件人
Char recive_addr[64];//收件地址
Long recive_tel;//收件人电话
Float weight;//货物重量
Char goods[ 32];//货物名称
Float price;//快递费用
};
4.项目要求
1、采用C语言完成代码的编写。
2、编写makefile管理整个项目。
3、编写项目设计书。
4、以模块化编写项目代码,按照不同模块组织.h /.c文件。
5、规范代码格式并添加注释。
6、编写测试报告,包括单模块测试,模块间测试。
7、编写项目总结,包括项目设计说明、项目中采用的知识点列举、项目中遇到的问题及解决方法等
5.项目完成参考步骤
1、完成服务端与客户端1对1的tcp连接。
2、把相关信息存贮到数据库中。
3、实现用户注册、登陆。
4、实现数据库的创建、管理与维护
5、实现寄快递,查找快递等功能
day2
#include <stdio.h> #include <stdlib.h> #include <string.h> //创建节点结构体 typedef struct node{ char data[16];//节点数据 struct node *L;//左节点 struct node *R;//右结点 }tree,*treeptr; //先序方式创建节点 treeptr create() { char buf[16]; scanf("%s",buf); if(strcmp(buf,"#")==0) { return NULL; } //创建节点空间 treeptr H=(treeptr)malloc(sizeof(tree)); if(H==NULL) { printf("节点创建失败\n"); return NULL; } strcpy(H->data,buf); H->L = create(); H->R = create(); return H; } //先序遍历 void pri_show(treeptr H) { if(H==NULL)//判断节点是否为空 { return ; } printf("%s",H->data); pri_show(H->L); pri_show(H->R); } //中序遍历 void mid_show(treeptr H) { if(H==NULL)//判断节点是否为空 { return ; } mid_show(H->L); printf("%s",H->data); mid_show(H->R); } //后序遍历 void lat_show(treeptr H) { if(H==NULL)//判断节点是否为空 { return ; } lat_show(H->L); lat_show(H->R); printf("%s",H->data); } int main() { treeptr H = create();//创建二叉树 pri_show(H); putchar(10); mid_show(H); putchar(10); lat_show(H); putchar(10); return 0; }