c语言订阅系统,c语言事件订阅机制

发布时间:2022-12-01

本文目录一览:

  1. 杂志订阅管理的c语言
  2. 关于c语言动态指针相关问题?
  3. 关于mosquitto怎么用c语言实现消息的订阅和发送(mqtt)
  4. C语言课程设计题目:杂志订阅管理软件

杂志订阅管理的c语言

#include<stdio.h>
#include "string.h"
#include "stdlib.h"
#include "conio.h"
#define max 20
struct magazine {
    char name[11];
    char sex[6];
    char addr[11];
    char phone_number[12];
    char unit_price[5];
    char amount[4];
    char time_limit[11];
} order[max];
void save(int n);
int load_record();
void search();
void printf_n(int n);
void printf_one(int i);
void input(int i);
void statistic();
void add();
void menu();
void main() {
    FILE *fp;
    fp = fopen("record.txt", "w"); /*在C:\Documents and Settings\Administrator里建立一个"record.txt"记事本*/
    fclose(fp);
    menu();
}
void menu() {
    int w, n;
    do {
        printf("\n");
        printf("\t\t* * * * * * * * * * * * * * * * * * * * * * * * *\n");
        printf("\t\t \n");
        printf("\t\t \n");
        printf("\t\t 欢迎来到杂志订阅系统! \n");
        printf("\t\t \n");
        printf("\t\t \n");
        printf("\t\t* * * * * * * * * * * * * * * * * * * * * * * * *\n");
        printf("\n\n\t\t *********************************************\n\n");
        printf("\t\t 1:add_new_subscriber\n");
        printf("\t\t 2:browse\n");
        printf("\t\t 3:statistic\n");
        printf("\t\t 4:exit\n\n");
        printf("\t\t *********************************************\n\n");
        printf(" Choice your number(1-4):[ ]\b\b");
        scanf("%d", &n);
        if (n < 1 || n > 4) w = 1;
        else w = 0;
    } while (w == 1);
    switch(n) {
        case 1: add(); break; /*增加新订户记录*/
        case 2: search(); break; /*查找过期的订户记录并删除*/
        case 3: statistic(); break; /*统计*/
        case 4: break; /*退出*/
    }
}
void add() {
    int t, i, m;
    system("cls");
    t = load_record();
    printf("您需要添加多少用户的信息?\n");
    printf("输入号码:[ ]\b\b\b");
    scanf("%d", &m);
    for(i = 0; i < m; i++) {
        printf("\n输入 %dth subscriber record.\n", i+1);
        input(t+i); /*调用输入函数*/
    }
    save(t+m); /*调用保存函数 保存t+m组数据*/
    system("cls"); /*******清屏*********/
    menu(); /*返回登陆界面*/
}
void input(int i) {
    printf("请输入:\n姓名 性别 地址 电话 杂志单价 数量 订阅期限\n");
    scanf("%s%s%s%s%s%s%s", order[i].name, order[i].sex, order[i].addr, order[i].phone_number, order[i].unit_price, order[i].amount, order[i].time_limit);
}
void statistic() {
    int t;
    t = load_record();
    printf("订阅者的数量[%d]\b\b\b", t);
    printf_n(t);
    printf("\n\n\n按任意键返回...\n\n");
    getch();
    menu();
}
void printf_one(int i) {
    printf("%-10s %-5s %-10s %-11s %-4s %-3s %-10s\n\n", order[i].name, order[i].sex, order[i].addr, order[i].phone_number, order[i].unit_price, order[i].amount, order[i].time_limit);
}
void printf_n(int n) {
    int j;
    system("cls"); /**********清屏************/
    printf("姓名 性别 地址 电话号码 价格 数量 时间期限\n\n");
    for(j = 0; j < n; j++) {
        if((j+1) % 10 == 0) {
            printf("\n\n按任意键继续 ...");
            getch();
            puts("\n\n");
        }
        printf_one(j); /*调用显示一个仪器记录的函数*/
    }
}
void search() {
    FILE *fp;
    char date[11], str[2];
    int t, i, sum = 0;
    t = load_record();
    system("cls");
    printf("请输入日期:[ ]\b\b\b\b\b\b\b\b\b\b\b");
    scanf("%s", date);
    printf("\n");
    if((fp = fopen("record.txt", "w")) == NULL) {
        printf("\n无法打开文件\n");
        exit(0);
    }
    system("cls");
    printf("\n");
    for(i = 0; i < t; i++) {
        if(strcmp(order[i].time_limit, date) > 0) {
            sum++;
            printf("\n");
            printf_one(i);
            printf("\n\n记录已过期!");
            printf("\n\n你想要删除此条信息吗?('Y'or'N'):[ ]\b\b");
            scanf("%s", str);
            if(strcmp(str, "Y") == 0 || strcmp(str, "y") == 0)
                continue;
        }
        fwrite(&order[i], sizeof(struct magazine), 1, fp);
    }
    fclose(fp);
    if(sum == 0) {
        printf("***************************************************\n\n");
        printf("很遗憾! 无法找到您想要的条件\n\n");
        printf("***************************************************\n\n");
    }
    printf("\n\n\n按任意键返回前一步...\n");
    getch();
    menu();
}
int load_record() {
    FILE *fp;
    int i;
    if((fp = fopen("record.txt", "r")) == NULL) {
        printf("\n无法打开文件\n");
        exit(0);
    }
    for(i = 0; !feof(fp); i++)
        fread(&order[i], sizeof(struct magazine), 1, fp);
    fclose(fp);
    return(i - 1);
}
void save(int n) {
    FILE *fp;
    int i;
    fp = fopen("record.txt", "w");
    if(fp == NULL) {
        printf("\n无法打开文件\n");
        exit(0);
    }
    for(i = 0; i < n; i++) {
        fwrite(&order[i], sizeof(struct magazine), 1, fp);
    }
    fclose(fp);
}

关于c语言动态指针相关问题?

N应该是一个宏定义的常量

#define N 111 //将这一句写在结构体的前面;

N就代表111了,当然也可以是其他数;

关于mosquitto怎么用c语言实现消息的订阅和发送(mqtt)

  1. 目标:测试Mosquitto使用MQTT协议发消息的相关性能指标,包含发送速度,并发负载能力,资源占用,消息到达率。
  2. MQTT协议简介
    1. 建立长连接。客户端发起请求和服务端建立长连接,建立成功后,服务端会返回ACK(CONNACK)
    2. 客户端订阅:客户端发起订阅,订阅成功后,服务端会返回ACK(SUBACK)
    3. 发消息:发布者会给服务端发消息,服务端在把消息给合适的客户端。
      • Qos=0(服务质量):客户端消息收到后,不会发出ACK给服务端(PUBACK)。
      • Qos=1:服务端会发ACK给发布者,客户端收到消息后会发ACK给服务端。
    4. 取消订阅:客户端发起取消订阅,服务端返回ACK(UNSUBACK)
    5. Pingreq/Pingresp:客户端和服务端会保持心跳。
  3. 存在问题
    1. 如何模拟出40W的用户
    2. 如何长连接,订阅,发消息,取消订阅,Pingreq行为如何实现。
  4. python开源库 Mosquitto.py,解决所有问题
    1. 模拟40W用户
      • 可以使用虚拟机和Mosquitto.py实现,具体为:一般一台虚拟机最多是6W+的模拟数据(需要修改句柄数,我使用5W),方法是Client_id可以简单的做出5W个来,然后调用Mosquitto里面的connect方法,建立长连接。准备8台虚拟机就可以实现40W客户端的模拟
    2. 行为的模拟
      • 订阅:Mosquitto.subscribe / 发消息:Mosquitto.publish / 取消订阅:Mosquitto.unsubscribe。简单一句话 Mosquitto库实现所有的行为.
  5. 指标:发送速度,到达率,并发负载,资源占用。
    • 发送速度:服务端日志记录,分析解决
    • 到达率:1.客户端记录下收到消息,分析计算。2.计算服务端收到的PUBACK(客户端收到消息返回的ACK),进行计算
    • 并发负载:5W 用户不断增加,注意观察服务端的负载情况。
    • 资源占用:其实主要是cpu/mem/带宽:cpu多核的话需要观察top命令下的_id字段, mem可以观察free -h命令的剩余mem, 带宽可以使用mpstat进行观察
  6. 可以预见问题
    • 模拟客户端的虚拟机需要修改句柄数才能支持5W的客户端模拟数量
    • 要先吃透MQTT协议的流程,吃透了进行测试会非常的方便
    • Clear session,设置为true则不为客户端保留消息,设置为false保留消息。其实就是客户端离线后在连接上可以收到之前推出的消息。

C语言课程设计题目:杂志订阅管理软件

你呀,干点正事吧,整天到晚的啊,你整天到晚的混得一点正型也没有,你看看人家,开车的买大楼房,你看看你,你一无所有,你脚下的地在抖,你身边的水在流。