TCP服务器接收数据保存至MYSQL数据库(Ubuntu平台)

最终效果图(更新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指定通信端口号运行即可
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42899627/article/details/106543769
今日推荐