linux-基于MYSQL的C程序实践

要求: 设计程序,使用TCP设计server端,可实现接收多个客户端发送的温度数值和湿度数值,并存储在数据库中。客户端每隔30秒发送一次数据,数据包括温度、湿度和时间戳。
建表:

create table exp3(
      temporary int,
      wet int,
      date varchar(20)
);

代码:

#include <stdio.h>
#include <string.h>
#include <mysql.h>

#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <wait.h>
#include <time.h>

#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

// 发送时间间隔, 单位秒
int sec = 30;

int insertdata(char* data) {
    int ret;
    MYSQL mySql;
    MYSQL *pTempSql = NULL;
    mysql_init(&mySql);
    pTempSql = mysql_real_connect(&mySql, "localhost", "root", "123456", "exp", 3306, NULL, 0);
    if (pTempSql != NULL) {
        char insertDataStr[100] = "INSERT INTO exp3 VALUES("; 
        strcat(insertDataStr, data);
		char t[20];
                // 获得时间戳
		sprintf(t, ", %ld", time(NULL));
		strcat(insertDataStr, t);
        strcat(insertDataStr, ");");
        // printf("%s", insertDataStr);
        ret = mysql_real_query(&mySql, insertDataStr, strlen(insertDataStr));
        if (ret == 0) {
            printf("insert ISMILELI info is success!\n");
        } else {
            printf("insert ISMILELI info is failure!\n");
        }

        mysql_close(&mySql);
    } else {
        printf("mysql_real_query():%s\n", mysql_error(pTempSql));
        return -1;
    }
}

// 客户端一
void client1(int signo) {
    int cid = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in saddr = {0};
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons("8080");
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    int res = connect(cid, (struct sockaddr *) &saddr, sizeof(struct sockaddr));

    char buf[128] = {0};


    bzero(buf, sizeof(buf));
	int rand_data = rand() % 10;
    sprintf(buf, "%d, %d", 1, rand_data);
    printf("%d, send data: %s\n", getpid(), buf);
    send(cid, buf, strlen(buf), 0);
	
    close(cid);
}

// 客户端二
void client2(int signo) {
    int cid = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in saddr = {0};
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons("8080");
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    int res = connect(cid, (struct sockaddr *) &saddr, sizeof(struct sockaddr));

    char buf[128] = {0};


    bzero(buf, sizeof(buf));
	int rand_data = rand() % 20 + 10;
    sprintf(buf, "%d, %d", 2, rand_data);
    printf("%d, send data: %s\n", getpid(), buf);
    send(cid, buf, strlen(buf), 0);

    close(cid);
}

void server() {
    int sid = socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_port = htons("8080");

    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    int res = bind(sid,(struct sockaddr *)&addr,sizeof(struct sockaddr));
    listen(sid,10);
    char buf[128] = {0};
    int cid;

    while(1){
        printf("pre recv data\n");
        cid = accept(sid,NULL,NULL);
        bzero(buf, sizeof(buf));
        recv(cid,buf,sizeof(buf) - 1,0);

        printf("get buf: %s\n", buf);
        insertdata(buf);
        close(cid);
    }

    close(sid);
}

int main(int argc, char *argv[]) {
    int pid1, pid2;


    pid1 = fork();
    if (pid1 == 0) {
       static time_t lasttime;
       struct sigaction act;
       union sigval tsval;
       act.sa_handler = client1;
       act.sa_flags = 0;
       sigemptyset(&act.sa_mask);
       sigaction(50, &act, NULL);
       time(&lasttime);
		
       time_t nowtime;
       while (1) {
        
	/*获取当前时间*/
        time(&nowtime);
	/*和上一次的时间做比较,如果大于等于sec秒,则立刻发送信号*/
        if(nowtime - lasttime >= sec){
	    /*向主进程发送信号,实际上是自己给自己发信号*/
            sigqueue(getpid(), 50, tsval);
            lasttime = nowtime;
        	}
    	}
    }
	
    pid2 = fork();
    if (pid2 == 0) {
	    static time_t lasttime;
	    struct sigaction act;
	    union sigval tsval;
	    act.sa_handler = client2;
	    act.sa_flags = 0;
	    sigemptyset(&act.sa_mask);
	    sigaction(50, &act, NULL);
	    time(&lasttime);

	    time_t nowtime;
            while (1) {
        
	      /*获取当前时间*/
              time(&nowtime);
	      /*和上一次的时间做比较,如果大于等于sec秒,则立刻发送信号*/
              if(nowtime - lasttime >= sec){
		   /*向主进程发送信号,实际上是自己给自己发信号*/
                  sigqueue(getpid(), 50, tsval);
                  lasttime = nowtime;
             }
    	}
    }
	
    server();
    return 0;
}
posted @ 2020-08-10 21:27  漫漫长夜何时休  阅读(476)  评论(0编辑  收藏  举报