当前位置: 首页 > news >正文

网络编程项目(速递项目)

目录

一、功能要求

服务器

用户客户端

快递员客户端

二、演示效果

1.注册,登录,注销功能演示

​编辑

2.用户功能演示

​编辑 3.快递员功能演示

 三、项目代码

1.头文件:

2.服务器:

3.用户端:

4..快递员端:

一、功能要求

仿照快递原理,实现一个速递项目,用户可以寄快递,查快递,快递员可以查快递,送快递。

服务器

处理客户端的请求,并将数据存入数据库中,客户端请求的数据从数据库进行获取,服务器转发给客户端。

用户客户端

实现账号的注册、登录、注销、修改用户密码功能,当登录成功时可以寄快递、查快递、修改快递信息、取消订单等功能。

快递员客户端

实现账号的注册、登录、注销、修改用户密码功能,当登录成功时可以查快递、送快递、查看历史订单等功能。

二、演示效果

1.注册,登录,注销功能演示

2.用户功能演示

 3.快递员功能演示

 三、项目代码

1.头文件:

#ifndef __HEAD_H__
#define __HEAD_H__#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <pthread.h>
#include <sqlite3.h>
#include <errno.h>
#include <netinet/tcp.h>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;          //快递费用
};typedef struct pack_head
{int acceptfd;unsigned char type;     //消息类型unsigned char usertype; //用户类型:1:用户  2:快递员char name[32];          //用户名char password[32];        //密码char buf[1024];           //调试信息struct order_msg msgg;  //单号信息
} PACK;#endif

2.服务器:

#include "head.h"fd_set readfds, tempfds;
PACK msg;
sqlite3 *db;void zhuce(PACK *msg);                  // 注册
void denglu(PACK *msg);                 // 登录
void jikuaidi(PACK *msg);               // 寄快递
void chakuaidi(PACK *msg);              // 查快递
void xiugaikuaidixinxi(PACK *msg);      // 修改快递信息
void quxiaodingdan(PACK *msg);          // 取消订单
void xiugaiyonghumima(PACK *msg);       // 修改用户信息
void zhuxiao(PACK *msg);                // 注销
void songkuaidi(PACK *msg);             // 送快递
void dingdanzhuangtaichaxun(PACK *msg); // 订单状态查询
void chakanlishijilu(PACK *msg);        // 查看历史记录int main(int argc, char const *argv[])
{char buf[256];if (argc != 2){printf("用法 <port>\n");return -1;}int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket 失败");return -1;}printf("socket 成功\n");int flag = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); // 设置地址重用struct sockaddr_in saddr, caddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = INADDR_ANY;socklen_t addrlen = sizeof(saddr);if (bind(sockfd, (struct sockaddr *)&saddr, addrlen) < 0){perror("bind 失败");return -1;}printf("bind 成功\n");if (listen(sockfd, 7) < 0){perror("listen 失败");return -1;}printf("正在监听 端口号为%d\n", ntohs(saddr.sin_port));// 创建或打开数据库if (sqlite3_open("./msg.db", &db) != 0){printf("打开或创建数据库失败:%s", sqlite3_errmsg(db));return -1;}printf("打开数据库成功\n");char *errmsg = NULL;// 创建三个表,分别是用户表,快递信息表,历史记录表if (sqlite3_exec(db, "create table user(name char,password char);", NULL, NULL, &errmsg)){printf("创建用户表失败:%s\n", errmsg);}// status订单情况 order订单号 sender发送人 send_addr发送地址 send_tel发送电话 reciver收件人 recive_addr收件地址 recive_tel收件人电话 weight货物重量 goods货物名称 price快递费用if (sqlite3_exec(db, "create table kuaidixinxi(status int,order_n long,sender char,send_addr char,send_tel long,reciver char,recive_addr char,recive_tel long,weight float,good char,price float );", NULL, NULL, &errmsg)){printf("创建快递信息表失败:%s\n", errmsg);}// status订单情况 order订单号 stime添加时间 rtime修改时间if (sqlite3_exec(db, "create table lishijilu(status int,order_n long,stime char ,rtime char);", NULL, NULL, &errmsg)){printf("创建历史记录表失败:%s\n", errmsg);}FD_ZERO(&readfds);FD_ZERO(&tempfds);FD_SET(sockfd, &readfds);int max = sockfd;while (1){tempfds = readfds;int ret = select(max + 1, &tempfds, NULL, NULL, NULL);if (ret < 0){perror("select 失败");return -1;}if (FD_ISSET(sockfd, &tempfds)){int acceptfd = accept(sockfd, (struct sockaddr *)&caddr, &addrlen);if (acceptfd < 0){perror("accept 失败");return -1;}printf("accept成功\n");printf("ip:%s port:%d\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));msg.acceptfd = acceptfd;FD_SET(acceptfd, &readfds);if (max < acceptfd){max = acceptfd;}}for (int i = sockfd + 1; i <= max; i++){if (FD_ISSET(i, &tempfds)){int rev = recv(i, &msg, sizeof(msg), 0);msg.acceptfd = i;if (rev < 0){perror("recv失败");return -1;}else if (rev == 0){printf("%s退出\n", inet_ntoa(caddr.sin_addr));FD_CLR(i, &readfds);close(i);while (!FD_ISSET(max, &readfds)){max--;}}else{printf("%s:%c\n", msg.name, msg.type);switch (msg.type){case 'R':zhuce(&msg);break;case 'L':denglu(&msg);break;case 'S':jikuaidi(&msg);break;case 'F':chakuaidi(&msg);break;case 'P':xiugaikuaidixinxi(&msg);break;case 'C':quxiaodingdan(&msg);break;case 'U':xiugaiyonghumima(&msg);break;case 'D':zhuxiao(&msg);break;case 'E':songkuaidi(&msg);break;case 'A':dingdanzhuangtaichaxun(&msg);break;case 'H':chakanlishijilu(&msg);break;default:break;}}}}}return 0;
}
void zhuce(PACK *msg) // 注册
{memset(msg->buf, 0, sizeof(msg->buf));char *errmsg = NULL;char sql[128];char check_sql[128];char **result = NULL;int rows, columns;while (1){ // 检查用户名是否已存在sprintf(check_sql, "select * from user where name='%s';", msg->name);if (sqlite3_get_table(db, check_sql, &result, &rows, &columns, &errmsg) != 0){sprintf(msg->buf, "查询失败: %s", errmsg);break;}if (rows > 0){sprintf(msg->buf, "用户名已存在");break;}// 执行插入操作sprintf(sql, "insert into user values('%s','%s');", msg->name, msg->password);if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "注册失败: %s", errmsg);break;}else{printf("%s\n", sql);sprintf(msg->buf, "注册成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void denglu(PACK *msg) // 登录
{memset(msg->buf, 0, sizeof(msg->buf));char sql[128];char *errmsg = NULL;char **result = NULL;int rows, columns;while (1){sprintf(sql, "select * from user where name = '%s' and password = '%s';", msg->name, msg->password);// 执行 SQL 查询int sqlget = sqlite3_get_table(db, sql, &result, &rows, &columns, &errmsg);if (sqlget != 0){sprintf(msg->buf, "sqlite3_get_table错误%s", errmsg);break;}else if (rows > 0){sprintf(msg->buf, "登录成功");break;}else{sprintf(msg->buf, "登录失败");break;}}send(msg->acceptfd, msg->buf, strlen(msg->buf), 0);
}
void jikuaidi(PACK *msg) // 寄快递
{memset(msg->buf, 0, sizeof(msg->buf));msg->msgg.status = 0;msg->msgg.price = msg->msgg.weight * 5;char sql[1024];char sql1[1024];char *errmsg = NULL;char **result = NULL;int rows, columns;time_t t;struct tm *tm;char stime[100];time(&t);tm = localtime(&t);msg->msgg.order = t;while (1){sprintf(stime, "%d-%d-%d-%d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour);snprintf(sql, sizeof(sql), "insert into kuaidixinxi values (%d,%ld,'%s','%s',%ld,'%s','%s',%ld,%f,'%s',%f);", msg->msgg.status, msg->msgg.order, msg->msgg.sender, msg->msgg.send_addr, msg->msgg.send_tel, msg->msgg.reciver, msg->msgg.recive_addr, msg->msgg.recive_tel, msg->msgg.weight, msg->msgg.goods, msg->msgg.price);snprintf(sql1, sizeof(sql1), "insert into lishijilu values (%d,%ld,'%s',0);", msg->msgg.status, msg->msgg.order, stime);if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "寄快递失败: %s", errmsg);break;}else{printf("%s\n", sql);}if (sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "放入历史记录失败: %s", errmsg);break;}else{printf("%s\n", sql1);sprintf(msg->buf, "寄快递成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void chakuaidi(PACK *msg) // 查快递
{memset(msg->buf, 0, sizeof(msg->buf));memset(msg->msgg.sender, 0, sizeof(msg->msgg.sender));memset(msg->msgg.send_addr, 0, sizeof(msg->msgg.send_addr));memset(msg->msgg.reciver, 0, sizeof(msg->msgg.reciver));memset(msg->msgg.recive_addr, 0, sizeof(msg->msgg.recive_addr));memset(msg->msgg.goods, 0, sizeof(msg->msgg.goods));char sql[1024];char *errmsg = NULL;char **result = NULL;int rows, columns;// 创建 SQL 查询sprintf(sql, "select * from kuaidixinxi where send_tel = %ld;", msg->msgg.send_tel);// 执行 SQL 查询int rc = sqlite3_get_table(db, sql, &result, &rows, &columns, &errmsg);if (rc != 0){sprintf(msg->buf, "查询失败: %s", errmsg);}else{if (rows > 0){for (int i = 1; i <= rows; ++i){strcat(msg->buf, "查询到的信息:");for (int j = 0; j < columns; ++j){strcat(msg->buf, result[i * columns + j]);strcat(msg->buf, " ");}strcat(msg->buf, "\n");}}else{strcpy(msg->buf, "没有找到该快递信息");}}send(msg->acceptfd, msg->buf, strlen(msg->buf) - 1, 0);
}
void xiugaikuaidixinxi(PACK *msg) // 修改快递信息
{char sql[1024];char *errmsg = NULL;printf("%s\n", msg->msgg.sender);while (1){if (strcmp(msg->buf, "发送人") == 0){sprintf(sql, "update kuaidixinxi set sender='%s' where order_n=%ld;", msg->msgg.sender, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}else if (strcmp(msg->buf, "发送地址") == 0){sprintf(sql, "update kuaidixinxi set send_addr='%s' where order_n=%ld;", msg->msgg.send_addr, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}else if (strcmp(msg->buf, "发送人电话") == 0){sprintf(sql, "update kuaidixinxi set send_tel=%ld where order_n=%ld;", msg->msgg.send_tel, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}else if (strcmp(msg->buf, "收件人") == 0){sprintf(sql, "update kuaidixinxi set reciver='%s' where order_n=%ld;", msg->msgg.reciver, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}else if (strcmp(msg->buf, "收件地址") == 0){sprintf(sql, "update kuaidixinxi set recive_addr='%s' where order_n=%ld;", msg->msgg.recive_addr, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}else if (strcmp(msg->buf, "收件人电话") == 0){sprintf(sql, "update kuaidixinxi set recive_tel=%ld where order_n=%ld;", msg->msgg.recive_tel, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}else if (strcmp(msg->buf, "货物重量") == 0){sprintf(sql, "update kuaidixinxi set weight=%f where order_n=%ld;", msg->msgg.weight, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}else if (strcmp(msg->buf, "货物名称") == 0){sprintf(sql, "update kuaidixinxi set good='%s' where order_n=%ld;", msg->msgg.goods, msg->msgg.order);memset(msg->buf, 0, sizeof(msg->buf));}msg->msgg.price = msg->msgg.weight * 5;if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "修改快递信息失败: %s", errmsg);break;}else{printf("%s\n", sql);sprintf(msg->buf, "修改快递信息成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void quxiaodingdan(PACK *msg) // 取消订单
{memset(msg->buf, 0, sizeof(msg->buf));char sql[1024];char sql1[1024];char *errmsg = NULL;char **result = NULL;int rows, columns;time_t t;struct tm *tm;char rtime[100];time(&t);tm = localtime(&t);while (1){sprintf(rtime, "%d-%d-%d-%d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour);snprintf(sql, sizeof(sql), "delete from kuaidixinxi where order_n=%ld;", msg->msgg.order);snprintf(sql1, sizeof(sql1), "update lishijilu set rtime='%s' where order_n=%ld;", rtime, msg->msgg.order);if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "取消订单失败: %s", errmsg);break;}else{printf("%s\n", sql);}if (sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "放入历史记录失败: %s", errmsg);break;}else{printf("%s\n", sql1);sprintf(msg->buf, "取消订单成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void xiugaiyonghumima(PACK *msg) // 修改用户信息
{memset(msg->buf, 0, sizeof(msg->buf));char sql[128];char *errmsg = NULL;char **result = NULL;int rows, columns;while (1){sprintf(sql, "update user set password='%s' where name = '%s';", msg->password, msg->name);// 执行 SQL 查询if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "修改失败: %s", errmsg);break;}else{printf("%s\n", sql);sprintf(msg->buf, "修改密码成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void zhuxiao(PACK *msg) // 注销
{memset(msg->buf, 0, sizeof(msg->buf));char sql[128];char *errmsg = NULL;char **result = NULL;int rows, columns;while (1){sprintf(sql, "delete from user where name = '%s';", msg->name);// 执行 SQL 查询if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "注销失败: %s", errmsg);break;}else{printf("%s\n", sql);sprintf(msg->buf, "注销成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void songkuaidi(PACK *msg) // 送快递
{memset(msg->buf, 0, sizeof(msg->buf));printf("%ld\n", msg->msgg.order);char sql[1024];char sql1[1024];char *errmsg = NULL;char **result = NULL;int rows, columns;time_t t;struct tm *tm;char rtime[100];time(&t);tm = localtime(&t);while (1){sprintf(rtime, "%d-%d-%d-%d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour);snprintf(sql, sizeof(sql), "update kuaidixinxi set status=1 where order_n=%ld;", msg->msgg.order);snprintf(sql1, sizeof(sql1), "update lishijilu set status=1,rtime='%s' where order_n=%ld;", rtime, msg->msgg.order);if (sqlite3_exec(db, sql, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "送快递失败: %s", errmsg);break;}else{printf("%s\n", sql);}if (sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != 0){sprintf(msg->buf, "放入历史记录失败: %s", errmsg);break;}else{printf("%s\n", sql1);sprintf(msg->buf, "送快递成功");break;}}send(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);
}
void dingdanzhuangtaichaxun(PACK *msg) // 订单状态查询
{memset(msg->buf, 0, sizeof(msg->buf));memset(msg->msgg.sender, 0, sizeof(msg->msgg.sender));memset(msg->msgg.send_addr, 0, sizeof(msg->msgg.send_addr));memset(msg->msgg.reciver, 0, sizeof(msg->msgg.reciver));memset(msg->msgg.recive_addr, 0, sizeof(msg->msgg.recive_addr));memset(msg->msgg.goods, 0, sizeof(msg->msgg.goods));char sql[1024];char *errmsg = NULL;char **result = NULL;int rows, columns;// 创建 SQL 查询sprintf(sql, "select * from kuaidixinxi where status = %d;", msg->msgg.status);// 执行 SQL 查询int rc = sqlite3_get_table(db, sql, &result, &rows, &columns, &errmsg);if (rc != 0){sprintf(msg->buf, "查询失败: %s", errmsg);}else{if (rows > 0){for (int i = 1; i <= rows; ++i){strcat(msg->buf, "查询到的信息:");for (int j = 0; j < columns; ++j){strcat(msg->buf, result[i * columns + j]);strcat(msg->buf, " ");}strcat(msg->buf, "\n");}}}send(msg->acceptfd, msg->buf, strlen(msg->buf) - 1, 0);
}
void chakanlishijilu(PACK *msg) // 查看历史记录
{char sql[1100];char *errmsg = NULL;char **result = NULL;int rows, columns;while (1){if (strcmp(msg->buf, "all") == 0){sprintf(sql, "select * from lishijilu;");memset(msg->buf, 0, sizeof(msg->buf));}else{sprintf(sql, "select * from lishijilu where stime='%s';", msg->buf);memset(msg->buf, 0, sizeof(msg->buf));}int rc = sqlite3_get_table(db, sql, &result, &rows, &columns, &errmsg);if (rc != 0){sprintf(msg->buf, "查询历史记录失败: %s", errmsg);break;}else{if (rows > 0){for (int i = 1; i <= rows; ++i){strcat(msg->buf, "查询到的信息:");for (int j = 0; j < columns; ++j){strcat(msg->buf, result[i * columns + j]);strcat(msg->buf, " ");}strcat(msg->buf, "\n");}break;}else{strcpy(msg->buf, "该历史记录不存在.");break;}}}send(msg->acceptfd, msg->buf, strlen(msg->buf) - 1, 0);
}

3.用户端:

#include "head.h"PACK msg;
int flag = 0;void denglujiemian();              // 登录界面
void kuaidijiemian();              // 快递界面
void zhuce(PACK *msg);             // 注册
void denglu(PACK *msg);            // 登录
void jikuaidi(PACK *msg);          // 寄快递
void chakuaidi(PACK *msg);         // 查快递
void xiugaikuaidixinxi(PACK *msg); // 修改快递信息
void quxiaodingdan(PACK *msg);     // 取消订单
void xiugaiyonghumima(PACK *msg);  // 修改用户密码
void zhuxiao(PACK *msg);           // 注销int main(int argc, char const *argv[])
{// 1.创建流式套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket err");return -1;}// 2.填充结构体struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = inet_addr("192.168.50.214");socklen_t addrlen = sizeof(saddr);// 3.请求连接if (connect(sockfd, (struct sockaddr *)&saddr, addrlen) < 0){perror("connect err");return -1;}printf("connect 成功\n");while (1){memset(msg.buf, 0, sizeof(msg.buf));msg.usertype = 1;msg.acceptfd = sockfd;if (flag == 0){denglujiemian(); // 登录界面}if (flag == 1){kuaidijiemian(); // 快递界面}printf("请输入:");scanf(" %c", &msg.type);printf("msg.type:%c\n", msg.type);switch (msg.type){case 'R':zhuce(&msg); // 注册break;case 'L':denglu(&msg); // 登录break;case 'S':jikuaidi(&msg); // 寄快递break;case 'F':chakuaidi(&msg); // 查快递break;case 'P':xiugaikuaidixinxi(&msg); // 修改快递信息break;case 'C':quxiaodingdan(&msg); // 取消订单break;case 'U':xiugaiyonghumima(&msg); // 修改用户密码break;case 'D':zhuxiao(&msg); // 注销用户break;case 'Q':flag = 0; // 返回登录菜单break;default:break;}}// 6.关闭close(sockfd);return 0;
}void denglujiemian() // 登录界面
{printf("**R:注册**\n");printf("**L:登录**\n");printf("**D:注销**\n");
}
void kuaidijiemian() // 快递界面
{printf("**F:查快递**\n");printf("**S:寄快递**\n");printf("**C:取消订单**\n");printf("**U:修改用户信息**\n");printf("**P:修改快递信息**\n");printf("**Q:返回一级菜单**\n");
}
void zhuce(PACK *msg) // 注册
{memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "注册成功") == 0){flag = 0;}
}
void denglu(PACK *msg) // 登录
{while (1){memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "登录成功") == 0){flag = 1;break;}if (strcmp(msg->buf, "登录失败") == 0){continue;}}
}
void jikuaidi(PACK *msg) // 寄快递
{memset(msg->msgg.sender, 0, sizeof(msg->msgg.sender));memset(msg->msgg.send_addr, 0, sizeof(msg->msgg.send_addr));memset(msg->msgg.reciver, 0, sizeof(msg->msgg.reciver));memset(msg->msgg.recive_addr, 0, sizeof(msg->msgg.recive_addr));memset(msg->msgg.goods, 0, sizeof(msg->msgg.goods));printf("请输入发件人姓名,地址,电话:");scanf("%s %s %ld", msg->msgg.sender, msg->msgg.send_addr, &msg->msgg.send_tel);getchar();printf("请输入收件人姓名,地址,电话:");scanf("%s %s %ld", msg->msgg.reciver, msg->msgg.recive_addr, &msg->msgg.recive_tel);getchar();printf("请输入货物重量,名称:");scanf("%f %s", &msg->msgg.weight, msg->msgg.goods);send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "寄快递成功") == 0){flag = 1;}
}
void chakuaidi(PACK *msg) // 查快递
{printf("请输入发件人电话:");scanf("%ld", &msg->msgg.send_tel);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}
void xiugaikuaidixinxi(PACK *msg) // 修改快递信息
{char leixing[100];printf("请输入要修改的快递单号:");scanf("%ld", &msg->msgg.order);getchar();while (1){printf("请输入要修改的内容(发送人S,发送地址S1,发送人电话S2,收件人R,收件地址R1,收件人电话R2,货物重量W,货物名称G):");scanf("%s", leixing);getchar();if (strcmp(leixing, "发送人")==0){memset(msg->msgg.sender, 0, sizeof(msg->msgg.sender));printf("请输入要修改的信息:");scanf("%s", msg->msgg.sender);getchar();printf("%s\n", msg->msgg.sender);strcpy(msg->buf, "发送人");break;}else if (strcmp(leixing, "发送地址")==0){memset(msg->msgg.send_addr, 0, sizeof(msg->msgg.send_addr));printf("请输入要修改的信息:");scanf(" %s", msg->msgg.send_addr);strcpy(msg->buf, "发送地址");break;}else if (strcmp(leixing, "发送人电话")==0){printf("请输入要修改的信息:");scanf(" %ld", &msg->msgg.send_tel);strcpy(msg->buf, "发送人电话");break;}else if (strcmp(leixing, "收件人")==0){memset(msg->msgg.reciver, 0, sizeof(msg->msgg.reciver));printf("请输入要修改的信息:");scanf(" %s", msg->msgg.reciver);strcpy(msg->buf, "收件人");break;}else if (strcmp(leixing, "收件地址")==0){memset(msg->msgg.recive_addr, 0, sizeof(msg->msgg.recive_addr));printf("请输入要修改的信息:");scanf(" %s", msg->msgg.recive_addr);strcpy(msg->buf, "收件地址");break;}else if (strcmp(leixing, "收件人电话")==0){printf("请输入要修改的信息:");scanf(" %ld", &msg->msgg.recive_tel);strcpy(msg->buf, "收件人电话");break;}else if (strcmp(leixing, "货物重量")==0){printf("请输入要修改的信息:");scanf(" %f", &msg->msgg.weight);strcpy(msg->buf, "货物重量");break;}else if (strcmp(leixing, "货物名称")==0){memset(msg->msgg.goods, 0, sizeof(msg->msgg.goods));printf("请输入要修改的信息:");scanf(" %s", msg->msgg.goods);strcpy(msg->buf, "货物名称");break;}else{printf("要修改的内容不存在,请重新输入\n");continue;}}send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}
void quxiaodingdan(PACK *msg) // 取消订单
{printf("请输入要取消的快递单号:");scanf("%ld", &msg->msgg.order);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}
void xiugaiyonghumima(PACK *msg) // 修改用户密码
{memset(msg->password, 0, sizeof(msg->password));printf("请输入要修改后的密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "修改密码成功") == 0){flag = 0;}
}
void zhuxiao(PACK *msg) // 注销
{memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入你要注销的用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}

4.快递员端:

#include "head.h"PACK msg;
int flag = 0;void denglujiemian();                   // 登录界面
void kuaidijiemian();                   // 快递界面
void zhuce(PACK *msg);                  // 注册
void denglu(PACK *msg);                 // 登录
void xiugaiyonghumima(PACK *msg);       // 修改用户密码
void songkuaidi(PACK *msg);             // 送快递
void dingdanzhuangtaichaxun(PACK *msg); // 订单状态查询
void chakanlishijilu(PACK *msg);        // 查看历史记录
void zhuxiao(PACK *msg);                // 注销int main(int argc, char const *argv[])
{// 1.创建流式套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket err");return -1;}// 2.填充结构体struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[1]));saddr.sin_addr.s_addr = inet_addr("192.168.50.214");socklen_t addrlen = sizeof(saddr);// 3.请求连接if (connect(sockfd, (struct sockaddr *)&saddr, addrlen) < 0){perror("connect err");return -1;}printf("connect 成功\n");while (1){memset(msg.buf, 0, sizeof(msg.buf));msg.usertype = 2;msg.acceptfd = sockfd;if (flag == 0){denglujiemian(); // 登录界面}if (flag == 1){kuaidijiemian(); // 快递界面}printf("请输入:");scanf(" %c", &msg.type);printf("msg.type:%c\n", msg.type);switch (msg.type){case 'R':zhuce(&msg); // 注册break;case 'L':denglu(&msg); // 登录break;case 'A':dingdanzhuangtaichaxun(&msg); // 订单状态查询break;case 'E':songkuaidi(&msg); // 送快递break;case 'H':chakanlishijilu(&msg); // 查看历史记录break;case 'U':xiugaiyonghumima(&msg); // 修改用户密码break;case 'D':zhuxiao(&msg); // 注销用户break;case 'Q':flag = 0; // 返回登录菜单break;default:break;}}// 6.关闭close(sockfd);return 0;
}void denglujiemian() // 登录界面
{printf("**R:注册**\n");printf("**L:登录**\n");printf("**D:注销**\n");
}
void kuaidijiemian() // 快递界面
{printf("**A:查快递**\n");printf("**E:送快递**\n");printf("**U:修改用户信息**\n");printf("**H:查询历史记录**\n");printf("**Q:返回一级菜单**\n");
}
void zhuce(PACK *msg) // 注册
{memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "注册成功") == 0){flag = 0;}
}
void denglu(PACK *msg) // 登录
{while (1){memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "登录成功") == 0){flag = 1;break;}if (strcmp(msg->buf, "登录失败") == 0){continue;}}
}
void xiugaiyonghumima(PACK *msg) // 修改用户密码
{memset(msg->password, 0, sizeof(msg->password));printf("请输入要修改后的密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);if (strcmp(msg->buf, "修改密码成功") == 0){flag = 0;}
}
void zhuxiao(PACK *msg) // 注销
{memset(msg->name, 0, sizeof(msg->name));memset(msg->password, 0, sizeof(msg->password));printf("请输入你要注销的用户名:");scanf("%s", msg->name);getchar();printf("请输入用户密码:");scanf("%s", msg->password);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}
void songkuaidi(PACK *msg) // 送快递
{printf("请输入要送达的快递单号:");scanf("%ld", &msg->msgg.order);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}
void dingdanzhuangtaichaxun(PACK *msg) // 订单状态查询
{printf("请输入要查询订单的状态(0未送达,1已送达):");scanf("%d", &msg->msgg.status);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);printf("%s\n", msg->buf);
}
void chakanlishijilu(PACK *msg) // 查看历史记录
{char leixing[100];while (1){printf("请输入要查询的选项(all:查询所有订单;time:(要查询的时间)\n");scanf("%s", leixing);getchar();if (strcmp(leixing, "all") == 0){strcpy(msg->buf, "all");send(msg->acceptfd, msg, sizeof(*msg), 0);memset(msg->buf, 0, sizeof(msg->buf));recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);break;}else if (strcmp(leixing, "time") == 0){printf("请输入要查询的时间:");scanf("%s", msg->buf);getchar();send(msg->acceptfd, msg, sizeof(*msg), 0);memset(msg->buf, 0, sizeof(msg->buf));recv(msg->acceptfd, msg->buf, sizeof(msg->buf), 0);break;}else{printf("输入错误,请重新输入\n");continue;}}printf("%s\n", msg->buf);
}


http://www.mrgr.cn/news/22745.html

相关文章:

  • C语言代码练习
  • Aigtek:功率放大器一般由什么组成
  • 孟德尔随机化的术语理解
  • 网络编程(学习)2024.9.4
  • 打造专业级PPT:用Python-pptx精准编辑图表属性
  • 【Python】PyPandoc:批量文件格式转换
  • 9月9日听IoT讲座
  • stack,queue的模拟实现,deque的模拟实现和小知识点的杂糅
  • PID控制算法(二)
  • 【脊线图】:附Origin详细画图流程
  • 优化销售流程,领先市场趋势!企元数智赠送小程序合规分销系统!
  • 《语文新读写》是知网收录吗?语文新读写编辑部查询
  • How to handle the response OpenAI Text-To-Speech API in Node.js?
  • 基于单片机的盲人智能水杯系统(论文+源码)
  • 声音克隆工具CosyVoice
  • 极狐GiLab 17.3 重点功能解读 升级指南
  • 基于微信小程序+Java+SSM+Vue+MySQL的考研论坛
  • ESP32 UDP 05
  • SpringBoot集成MyBatis-Plus
  • 电商数据API接口|唯品会商品详情数据的接入说明【附测试实例】