修复部分bug

This commit is contained in:
2025-11-21 18:02:37 +08:00
parent 26dac05e5b
commit 08589dfe79
7 changed files with 153 additions and 120 deletions

View File

@ -7,6 +7,7 @@
#include "tools/log/log.h"
#include "tools/quit/quit.h"
#include "erroprocess/erroprocess.h"
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
@ -18,6 +19,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#include <sys/mman.h>
static void safe_strcpy(char *dst, size_t dst_size, const char *src)
{
@ -77,94 +79,6 @@ int rbt_parse_json(const char *json_text, rbt_msg *out)
return 0; // 成功
}
/**
* @brief 初始化HTTP监听socket所有错误通过logmanager记录
* @param port 监听端口
* @param logger 日志管理器实例指针
* @return 成功返回监听fd失败返回-1并记录日志
*/
int init_http_network(int port, log_manager *logger)
{
logs *log;
int fd;
/* 1. 创建socket */
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1) {
log = malloc(sizeof(logs));
// cppcheck-suppress uninitdata
snprintf(log->log, sizeof(log->log),
"[FATAL] socket() failed: %s", strerror(errno));
logger->in_log(log, logger);
return -1;
}
/* 2. 设置SO_REUSEADDR避免TIME_WAIT状态导致bind失败 */
int opt = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) == -1) {
log = malloc(sizeof(logs));
snprintf(log->log, sizeof(log->log),
"[ERROR] setsockopt(SO_REUSEADDR) on fd=%d failed: %s",
fd, strerror(errno));
logger->in_log(log, logger);
close(fd);
return -1;
}
/* 3. 设置为非阻塞模式配合epoll使用 */
int flags = fcntl(fd, F_GETFL, 0);
if (flags == -1) {
log = malloc(sizeof(logs));
snprintf(log->log, sizeof(log->log),
"[ERROR] fcntl(F_GETFL) on fd=%d failed: %s", fd, strerror(errno));
logger->in_log(log, logger);
close(fd);
return -1;
}
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
log = malloc(sizeof(logs));
snprintf(log->log, sizeof(log->log),
"[ERROR] fcntl(O_NONBLOCK) on fd=%d failed: %s", fd, strerror(errno));
logger->in_log(log, logger);
close(fd);
return -1;
}
/* 4. 绑定到指定端口 */
struct sockaddr_in addr = {0};
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 监听所有网卡
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
log = malloc(sizeof(logs));
snprintf(log->log, sizeof(log->log),
"[FATAL] bind(port %d) failed: %s (fd=%d)",
port, strerror(errno), fd);
logger->in_log(log, logger);
close(fd);
return -1;
}
/* 5. 开始监听 */
if (listen(fd, 10) == -1) {
log = malloc(sizeof(logs));
snprintf(log->log, sizeof(log->log),
"[FATAL] listen(fd=%d, backlog=10) failed: %s",
fd, strerror(errno));
logger->in_log(log, logger);
close(fd);
return -1;
}
/* 6. 成功日志 */
log = malloc(sizeof(logs));
snprintf(log->log, sizeof(log->log),
"[HTTP] Successfully listening on port %d (fd=%d)", port, fd);
logger->in_log(log, logger);
return fd;
}
ssize_t read_req(int fd, void *buf)
{
@ -175,7 +89,7 @@ ssize_t read_req(int fd, void *buf)
return (n > 0) ? n : -1;
}
int process_message(char *req, log_manager *logger) {
int process_message(char *req, log_manager *logger,rbt_msg *swap) {
if(req == NULL) return 0;
int fd;
@ -195,18 +109,15 @@ int process_message(char *req, log_manager *logger) {
const char *body = http_get_body(req_buf);
free(req_buf);
rbt_msg message;
if(rbt_parse_json(body, &message) == 0) {
make_swap((void*)&message);
if(rbt_parse_json(body,swap) == 0) {
logs *log = malloc(sizeof(logs));
// cppcheck-suppress uninitdata
snprintf(log->log, sizeof(log->log), "%s message %s processed ok\n",
message.nickname, message.raw_message);
swap->nickname,swap->raw_message);
make_swap(swap);
logger->in_log(log, logger);
}
// ****** 修复2发送HTTP响应 ******
const char *response =
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/plain\r\n"
@ -248,10 +159,10 @@ void *pth_module(void *args_p)
free(args_p);
char name[256] = {'\0'};
sprintf(name,"chatrebot%lu",pthread_self());
int swap = create_swap(name);
int swapfd = create_swap(name);
//创建共享内存
char swap_arg[64] = {'\0'};
sprintf(swap_arg,"%d",swap);
sprintf(swap_arg,"%d",swapfd);
pid_t id = fork();
if(id == 0)
{
@ -266,6 +177,7 @@ void *pth_module(void *args_p)
sprintf(pth_log->log,"PID:%lu launched python plugines\n",pthread_self());
logger->in_log(pth_log,logger);
rbt_msg *swap = (rbt_msg*)mmap(NULL, sizeof(rbt_msg), PROT_READ|PROT_WRITE, MAP_SHARED,swapfd, 0);
//拉起python插件管理器
for(;;){
//线程池中,单个线程模型
@ -283,7 +195,7 @@ void *pth_module(void *args_p)
pth_log = (logs*)malloc(sizeof(logs));
sprintf(pth_log->log,"processd message");
logger->in_log(pth_log,logger);
process_message(req,logger);
process_message(req,logger,swap);
atomic_fetch_add(&pmd->status, 1);
}
}