mysql 基于c_linux-基于MYSQL的C程序实践

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

建表:

create table exp3(

temporary int,

wet int,

date varchar(20)

);

代码:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

// 发送时间间隔, 单位秒

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;

}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值