socket C 客户端发送数据到服务端,操作mysql数据库

mysql
create table user
(
id int auto_increament primary key,
account varchar(20) not null unique,
passwd varchar(20) not null,
phone varchar(20) not null unique
)
服务端程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<malloc.h>
#include<mysql/mysql.h>

#define server_port "5000"
#define MAXPENDING 1000
#define isntUser -3
#define login_status 1
#define enroll_status 2
#define modifyPasswd_status 3
#define exist_user 1
#define exist_phone 1
int sqlLen;
void dealUserError(const char *msg,const char *detail);
void dealSystemError(const char *msg);
void getClientInformation(int clntSocket,char **recvInfo);
int login(char * temp[10]);
int enroll(char * temp[10]);
int modifyPasswd(char *temp[10]);
void sendInformation(int clntSocket,char *status);

int isExistUser(char *user);
int isExistPhone(char *phone);
int checkRecvString(int clntSocket ,char *temp[10]);
int checkRecvString(int clntSocket ,char *temp[10])
{
    int k = atoi(temp[0]);
    int i = 0;
    for(;temp[i];i++)
        ;
    //printf("string_num = %d\n",i);
    if(k == login_status)
    {
        if(i != 3)
        {
            sendInformation(clntSocket,"error");
            return -1;
        }
    }
    else if(k == enroll_status)
    {
        if(i != 4)
        {
            sendInformation(clntSocket,"error");
            return -1;
        }
    }
    else if(k == modifyPasswd_status)
    {
        if(i != 4)
        {
            sendInformation(clntSocket,"error");
            return -1;
        }
    }
    else
    {
        sendInformation(clntSocket,"error");
        return -1;
    }
    return 1;

}
void executeOper(int clntSocket,char *temp[10]);
void sendInformation(int clntSocket,char *status)
{
    ssize_t num = send(clntSocket,status,strlen(status),0);
    //printf("%d\n",num);
    close(clntSocket);
}
void executeOper(int clntSocket,char *temp[10])
{
    int n = atoi(temp[0]);
    int check_recv_string = checkRecvString(clntSocket,temp);
    if(check_recv_string == -1)
        return ;
    else
    {
        int status;
        if(n == login_status) //表示登录操作
        {
            puts("登录");
        //  nothingOper(temp);
            status = login(temp);

        //printf("status = %d\n",status);
            if(status == isntUser)
                sendInformation(cln
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较复杂的问题。下面是一个简单的C++代码框架,可以实现一个基于Linux的服务端,可以接受多个客户端的连接,并将收到的数据存储到数据库中。 ```c++ #include <iostream> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <thread> #include <queue> #include <mutex> #include <condition_variable> #include <mysql/mysql.h> // 需要安装mysql包 using namespace std; // 数据库连接参数 const char* db_host = "localhost"; const char* db_user = "root"; const char* db_password = "password"; const char* db_name = "database_name"; // 线程池参数 const int thread_num = 4; // 线程数 queue<int> client_queue; // 客户端队列 mutex client_mutex; // 客户端队列锁 condition_variable client_cv; // 客户端队列条件变量 // 数据库连接 MYSQL* mysql_conn; // 处理客户端请求的线程函数 void process_client(int client_fd) { // TODO: 处理客户端请求,将数据存储到数据库中 } // 线程池函数 void thread_pool() { while (true) { unique_lock<mutex> lock(client_mutex); client_cv.wait(lock, []{ return !client_queue.empty(); }); int client_fd = client_queue.front(); client_queue.pop(); lock.unlock(); process_client(client_fd); } } int main() { // 初始化数据库连接 mysql_conn = mysql_init(NULL); if (mysql_conn == NULL) { cerr << "mysql_init error: " << mysql_error(mysql_conn) << endl; exit(1); } if (mysql_real_connect(mysql_conn, db_host, db_user, db_password, db_name, 0, NULL, 0) == NULL) { cerr << "mysql_real_connect error: " << mysql_error(mysql_conn) << endl; exit(1); } // 创建套接字 int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { cerr << "socket error" << endl; exit(1); } // 绑定套接字 sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8888); if (bind(server_fd, (sockaddr*)&server_addr, sizeof(server_addr)) == -1) { cerr << "bind error" << endl; exit(1); } // 监听套接字 if (listen(server_fd, 10) == -1) { cerr << "listen error" << endl; exit(1); } // 创建线程池 for (int i = 0; i < thread_num; i++) { thread([&]{ thread_pool(); }).detach(); } // 接受客户端连接,加入客户端队列 while (true) { int client_fd = accept(server_fd, NULL, NULL); if (client_fd == -1) { cerr << "accept error" << endl; continue; } unique_lock<mutex> lock(client_mutex); client_queue.push(client_fd); lock.unlock(); client_cv.notify_one(); } return 0; } ``` 上述代码中的主要逻辑是:首先初始化一个MySQL连接,在主线程中创建一个套接字并进行监听。然后创建一个线程池,线程数为4。每个线程会不断从客户端队列中取出客户端套接字,并调用process_client函数进行处理。process_client函数中可以使用MySQL的C API来连接数据库,将数据存储到数据库中。 当有新的客户端连接时,将其加入到客户端队列中,然后通过条件变量通知线程池中的线程进行处理。由于客户端队列是共享资源,因此需要使用互斥锁进行保护。 需要注意的是,以上代码仅为一个简单的框架,还有一些细节需要根据具体情况进行处理,如异常处理、数据库连接池等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值