c++实现linux服务端,接受各客户端的数据并存储数据到数据库中,要求服务端做并发处理
时间: 2024-02-23 21:03:04 浏览: 85
C++写的客户端与服务端
好的,这是一个比较复杂的问题。下面是一个简单的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来连接数据库,将数据存储到数据库中。
当有新的客户端连接时,将其加入到客户端队列中,然后通过条件变量通知线程池中的线程进行处理。由于客户端队列是共享资源,因此需要使用互斥锁进行保护。
需要注意的是,以上代码仅为一个简单的框架,还有一些细节需要根据具体情况进行处理,如异常处理、数据库连接池等。
阅读全文