要求: 设计程序,使用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;
}