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

news2024/9/20 22:05:35

目录

一、功能要求

服务器

用户客户端

快递员客户端

二、演示效果

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.coloradmin.cn/o/2118051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue2 day-04

目录 一. vue组件 1.1 为什么用组件 1.2 vue组件 1.3 基础使用 1.4 全局 - 注册使用 1.5 局部 - 注册使用 1.4 用less写的样式 二. Vue组件之间传值(重点) 2.1 父组件向子组件传值 2.2 子组件向父组件传值 2.3 兄弟之间的传递 三. vue生命周期 3.1 含义 3.2 钩子…

SprinBoot+Vue智慧农业专家远程指导系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

Transformer、RNN和SSM的相似性探究:揭示看似不相关的LLM架构之间的联系

通过探索看似不相关的大语言模型(LLM)架构之间的潜在联系,我们可能为促进不同模型间的思想交流和提高整体效率开辟新的途径。 尽管Mamba等线性循环神经网络(RNN)和状态空间模型(SSM)近来备受关注,Transformer架构仍然是LLM的主要支柱。这种格局可能即将发生变化:像Jamba、Samb…

红队C2工具Sliver探究与免杀

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

【QCA(定性比较分析)组态研究】01 基础入门

【目录】 1.理论入门1.1和个案分析的区别1.2 QCA的特点因果非对称:殊途同归:1.3 什么时候用到QCA2.QCA的一般步骤3.QCA论文精读1.理论入门 QCA(定性比较分析)是一种探索性研究方法,旨在通过系统地比较不同案例的条件组合,识别出影响结果的因果关系。它结合了定性和定量分…

HarmonyOS Next系列之实现一个左右露出中间大两边小带缩放动画的轮播图(十二)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

ASP.NET Core 中间件

一、什么是中间件&#xff1f; 中间件 是一种装配到 ASP.NET Core 应用程序请求处理管道中的软件组件&#xff0c;用于处理 HTTP 请求和响应。 每个中间件组件可以&#xff1a; 选择是否将请求传递到下一个中间件&#xff1a;通过调用 next() 或者不调用 next() 来决定是否将…

HTML5中的数据存储sessionStorage、localStorage

第8章 HTML5中的数据存储 之前通常使用Cookie存储机制将数据保存在用户的客户端。 H5增加了两种全新的数据存储方式&#xff1a;Web Stroage和Web SQL Database. 前者用于临时或永久保存客户端少量数据&#xff0c;后者是客户端本地化的一套数据库系统。 8.1 Web Storage存…

日本“大米荒”持续!政府再次拒绝投放储备米

KlipC报道&#xff1a;日本多地从7月开始出现“大米荒”&#xff0c;有部分新米上市&#xff0c;但是许多超市的大米仍然存在断购或限购的情况&#xff0c;并且部分新米价格上涨至去年同期的两倍。大阪府官员再次呼吁日本中央政府尽快投放储备米以缓解供应紧张&#xff0c;但遭…

Dynamics CRM Ribbon Workbench-the solution contains non-entity components

今天在一个低版本的环境里准备用Ribbon Workbench去编辑一个按钮时&#xff0c;遇到了如下错误 一开始没当回事&#xff0c;以为是我的解决方案问题&#xff0c;去检查了下&#xff0c;只有一个组件&#xff0c;并且哪怕我把组件换成了某个实体也不行&#xff0c;尝试了其他任何…

开源NAS系统-OpenMediaVault(OMV)共享存储网盘搭建和使用(保姆级教程)

1、OpenMediaVault简介 OpenMediaVault,简称:OMV,是由原 FreeNAS 核心开发成员 Volker Theile 发起的基于 Debian Linux 的开源 NAS 操作系统,主要面向家庭用户和小型办公环境。 OpenMediaVault是一款基于Debian Linux的开源网络附加存储(NAS)操作系统,它提供了强大的存…

酒店智能轻触开关:智慧化的创新实践

在追求高品质住宿体验的今天&#xff0c;酒店智能轻触开关作为智慧酒店建设的关键一环&#xff0c;正逐步成为提升酒店服务品质、优化运营效率、增强顾客满意度的有力工具。本文将深入探讨酒店智能轻触开关如何助力酒店实现智慧化管理&#xff0c;以及它所带来的多重变革。 一、…

大模型时代下,nlp初学者需要怎么入门?

前言 自从 ChatGPT 横空出世以来&#xff0c;自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;研究领域就出现了一种消极的声音&#xff0c;认为大模型技术导致 NLP “死了”。 有人认为 NLP 的市场肯定有&#xff0c;但 NLP 的研究会遇到麻…

图片产生3D模型

HyperHuman 上传图片&#xff0c;点击生成 可以多生成几次&#xff0c;点击应用 让效果再好一点 生成完成之后可以导出为fbx格式

实战|等保2.0 Oracle数据库测评过程

以下等保测评过程以Oracle 11g为例&#xff0c;通过PL/SQL进行管理&#xff0c;未进行任何配置、按照等保2.0标准&#xff0c;2021报告模板&#xff0c;三级系统要求进行测评。 一、身份鉴别 a) 应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;…

E212: Can‘t open file for writing

如图 1. 查看当前用户的用户名和所属组 如果你只想查看当前登录用户的用户名和所属组&#xff0c;可以使用以下命令&#xff1a; whoami groups 检查文件和目录权限&#xff1a; ls -ld /private/var/log/wyhy ls -l /private/var/log/wyhy/market.log 修改文件权限&#…

RAKsmart美国大带宽服务器租用体验怎么样?

RAKsmart是一家提供全球服务器租用服务的知名供应商&#xff0c;其在美国的服务器产品种类多样&#xff0c;包括大带宽服务器、多IP站群服务器以及高防御服务器等&#xff0c;以适应不同业务的需求。rak小编为您整理发布。 下面是对RAKsmart美国大带宽服务器租用的具体介绍&…

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

随机分类,保持均衡水平Python

1、目的&#xff1a; 10000个样本有4个指标&#xff0c;按照逾期金额分10类&#xff0c;确保每类别逾期金额均衡。 2、数据&#xff1a; 3、思路&#xff1a; 将10000个样本按照逾期金额排序&#xff0c; 等距分箱为2500个类别 增加一列随机数 根据类别和随机数升序排列 增加…

MCU6.用keil新建项目

1.新建项目 打开keil4 2.选择单片机的类型 STC并没有出现在其中,但兼容8051芯片,选Atmel的AT89C51或AT89C52均可 本文选AT89C52 弹出的窗口点否 3.查看项目 4.新建文件 5.保存文件 6.将文件添加到工程 双击Source Group 1 点击Add 7.添加已有的工程 如果要添加已有的工程 8…