最终效果图(更新A3501对应的数值并记录更新时间)
sudo apt-get install mysql-server mysql-client
sudo apt-get install libmysqlclient-dev
MySQL需要提前安装,因为MySQL文件(m.c)需要包含头文件(#include <mysql/mysql.h>
),需要用到一些封装的函数
TCP套接字服务器( server.c 文件)
#include "head.h"
#include <mysql/mysql.h>
#include "m.h"
int main(int argc,char **argv)
{
//创建tcp套接字
int fd=socket(AF_INET,SOCK_STREAM,0);
//准备地址结构体ipv4
struct sockaddr_in addr;
socklen_t len=sizeof(addr);
bzero(&addr,len);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(atoi(argv[1]));
//绑定地址到指定的通信端点
if(bind(fd,(struct sockaddr *)&addr,len)==0)
{
printf("\n绑定成功\n");
//设定监听状态
//注意:只有处于监听状态的tcp套接字,才能接受対端的链接请求
//参数2规定的是该通信端点能(同时)接受连接请求的数量
//不是连接请求的总数
if(listen(fd,2)==0)
{
printf("设置监听成功\n");
}
}
else
{
printf("端口绑定失败\n");
close(fd);
printf("服务器已经断开\n");
return 0;
}
//静静等待对端的连接
struct sockaddr_in peeraddr;
len=sizeof(peeraddr);
bzero(&peeraddr,len);
int connfd=accept(fd,(struct sockaddr *)&peeraddr,&len);
printf("连接成功,对端地址:%s:%hu\n",
inet_ntoa(peeraddr.sin_addr),
ntohs(peeraddr.sin_port));
char msg[10];
char ID_CARD_NAME[10];
char ch;
//循环等待数据接收
while(1)
{
bzero(msg,10);//数组清零
bzero(ID_CARD_NAME,10);//数组清零
if((read(connfd,msg,10)!=0)&&(msg[3]=='A'))
{
sprintf(ID_CARD_NAME,"%c%c%c%c%c",msg[3],msg[4],msg[5],msg[6],msg[7]);
printf("ID=%s\n",ID_CARD_NAME);
mysql_link();//连接MYSQL
print_table("resident");//查看表中内容
update_data("credit=credit+1",ID_CARD_NAME);
update_data("latest_time=current_timestamp",ID_CARD_NAME);
print_table("resident");//查看表中内容
continue;
}
}
mysql_closed();//关闭MySQL
close(connfd);
close(fd);
printf("服务器已经断开\n");
return 0;
}
head.h 文件
#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <strings.h>
#include <sys/soundcard.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <time.h>
#include <syslog.h>
#include <assert.h>
#include <sys/ioctl.h>
#include <errno.h>
#endif
MYSQL数据库语句(m.c)
1.连接数据库(mysql_link)
2.关闭数据库(mysql_close)
3.打印 mydb 数据库的表(show_tables)
4.C语言打印表格(print_table)
5.更新数据库(update_date)
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "mysql/mysql.h"
#include "m.h"
void mysql_link(void)//连接数据库
{
MYSQL *mysql_ctr;
mysql_ctr = mysql_init(NULL);//初始化
mysql_ctr = mysql_real_connect(mysql_ctr, IP_addr, user, password, database, 0 ,NULL, 0);
if (mysql_ctr)
{
printf("\nMYSQL连接成功\n");
}
else
{
printf("\nMYSQL连接失败\n");
}
}
void mysql_closed(void)//关闭数据库
{
MYSQL *mysql_ctr;
mysql_close(mysql_ctr);
printf("MYSQL关闭成功\n");
}
void show_tables(void)//打印在mydb数据库的表
{
static int t=0;
MYSQL *mysql_ctr;
static MYSQL_RES *res; // 返回查询结果
static MYSQL_ROW row; // 返回行数据
t = mysql_query(mysql_ctr, "show databases");
if (t)
{
printf("Failed to query: %s\n", mysql_error(mysql_ctr));
}
res = mysql_store_result(mysql_ctr);
printf("\n***********************************************\n");
while ((row = mysql_fetch_row(res)))
{
for(t = 0; t < mysql_num_fields(res); t++)
{
printf("%s\t", row[t]);
}
printf("\n***********************************************\n");
}
mysql_free_result(res);
}
void print_table(char table_name[20])//C语言打印表格
{
static int i,j;
MYSQL *mysql_ctr;
char *cmd = "select * from ";
static char query[50];
static MYSQL_RES *res; // 返回查询结果
static MYSQL_ROW row; // 返回行数据
memset(query, '\0', sizeof(query));//初始化query,清零
sprintf(query, "%s%s", cmd, table_name);
i=mysql_query(mysql_ctr, query);
if (i)
{
printf("Failed to query\n");
}
else
{
//printf("\nQuery successfully!\n");
printf("\n%s",table_name);
res = mysql_store_result(mysql_ctr);
j=mysql_num_fields(res);
printf("\n********************************************\n");
while (row = mysql_fetch_row(res)) //依次保存table每行的内容成数组
{
for(i = 0; i < j; i++)
{
printf("%s\t", row[i]);
}
printf("\n********************************************\n");
}
}
mysql_free_result(res);//释放结果内存
}
void update_data(char handle[50], char *ID_name)//更新数据
{
MYSQL *mysql_ctr;
static int k;
static char query[100];
static char *cmd = "update resident";
sprintf(query, "%s set %s where ID=\"%s\"", cmd, handle, ID_name); //转义\"
//printf("%s\n", query);
k = mysql_real_query(mysql_ctr, query, strlen(query));
if (k)
{
printf("Failed to query: %s\n", mysql_error(mysql_ctr));
}
printf("\nUpdate data sucessfully!\n");
}
m.h
#ifndef _M_H
#define _M_H
#include <mysql/mysql.h>
#define IP_addr "localhost"
#define user "admin"
#define password "admin"
#define database "mydb"
volatile extern MYSQL *mysql_ctr;
void mysql_link(void);
void mysql_closed(void);
void print_table(char table_name[20]);
void show_tables(void);
void update_data(char handle[50], char ID_name[10]);
#endif
终端GCC编译
gcc server.c m.c -o server -lmysqlclient
编译通过就OK,然后./server 50002
指定通信端口号运行即可