#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sqlite3.h>

#define MAX_BUFFER_SIZE 1024

// 回调函数用于处理数据库查询结果 int callback(void *data, int argc, char **argv, char **azColName) { char *suggestion = (char *)data; sprintf(suggestion, '%s%s', suggestion, argv[0]); return 0; }

int main() { int serverSocket, clientSocket; struct sockaddr_in serverAddr, clientAddr; socklen_t addrSize = sizeof(struct sockaddr_in); char buffer[MAX_BUFFER_SIZE]; int userid; sqlite3 *db; char *errMsg = 0; char suggestion[MAX_BUFFER_SIZE];

// 创建数据库连接
if (sqlite3_open('database.db', &db) != SQLITE_OK) {
    fprintf(stderr, '无法打开数据库: %s\n', sqlite3_errmsg(db));
    return 1;
}

// 创建服务器socket
if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror('创建socket失败');
    return 1;
}

// 设置服务器地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
serverAddr.sin_addr.s_addr = INADDR_ANY;
memset(serverAddr.sin_zero, '\0', sizeof(serverAddr.sin_zero));

// 绑定服务器地址和端口
if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr)) == -1) {
    perror('绑定失败');
    return 1;
}

// 监听连接
if (listen(serverSocket, 10) == -1) {
    perror('监听失败');
    return 1;
}

printf('服务器已启动,等待连接...\n');

while (1) {
    // 接受客户端连接
    if ((clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrSize)) == -1) {
        perror('接受连接失败');
        return 1;
    }

    // 读取客户端发送的userid
    if (recv(clientSocket, &userid, sizeof(userid), 0) == -1) {
        perror('读取userid失败');
        close(clientSocket);
        continue;
    }

    printf('接收到来自客户端的连接,userid: %d\n', userid);

    // 清空suggestion数组
    memset(suggestion, '\0', sizeof(suggestion));

    // 查询数据库获取建议
    sprintf(buffer, 'SELECT suggestion FROM Status WHERE uid = %d AND device_name = '' ORDER BY sid DESC LIMIT 1;', userid);
    if (sqlite3_exec(db, buffer, callback, suggestion, &errMsg) != SQLITE_OK) {
        fprintf(stderr, '数据库查询失败: %s\n', errMsg);
        close(clientSocket);
        continue;
    }

    printf('发送建议给客户端: %s\n', suggestion);

    // 判断suggestion是否为空
    if (strlen(suggestion) == 0) {
        printf('没有找到建议\n');
        close(clientSocket);
        continue;
    }

    // 发送建议给客户端
    if (send(clientSocket, suggestion, strlen(suggestion), 0) == -1) {
        perror('发送建议失败');
        close(clientSocket);
        continue;
    }

    // 关闭与客户端的连接
    close(clientSocket);
}

// 关闭数据库连接
sqlite3_close(db);

// 关闭服务器socket
close(serverSocket);

return 0;

}

C语言基于SQLite3的服务器端建议推送系统

原文地址: http://www.cveoy.top/t/topic/fCcc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录