diff --git a/client_test.cxx b/client_test.cxx index e1f7de8..3e3927d 100644 --- a/client_test.cxx +++ b/client_test.cxx @@ -106,5 +106,8 @@ int main() std::cout << "coptk: " << frame->coptk << std::endl; } + delete frame; + t.join(); + return 0; } \ No newline at end of file diff --git a/server.cxx b/server.cxx index d932f30..be6ce38 100644 --- a/server.cxx +++ b/server.cxx @@ -1,12 +1,18 @@ #include "server.h" #include -Server::Server(asio::io_context& io_context, short port) - : io_context_(io_context), acceptor_(io_context) +Server::Server(asio::io_context& io_context, short port) : io_context_(io_context), acceptor_(io_context) { port_ = port; } +Server::~Server() +{ + for (auto& client : clients_) { + client.second.detach(); + } +} + void Server::start() { asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port_); @@ -50,6 +56,18 @@ void Server::do_accept() void Server::th_client(const std::shared_ptr& socket, const std::string& client_key) { + + std::shared_ptr deleter(new int(0), [&](int* p) { + std::unique_lock lock(cli_mutex_); + delete p; + client_map_.erase(client_key); + if (clients_.find(client_key) != clients_.end()) { + clients_.at(client_key).detach(); + clients_.erase(client_key); + } + std::cout << "th_client deleter client " << client_key << "exit." << std::endl; + }); + asio::error_code error; std::shared_ptr cache = nullptr; @@ -84,11 +102,15 @@ void Server::th_client(const std::shared_ptr& socket, con req.type = FrameType::TYPE_RESPONSE_ERROR; send_frame(socket, req); } else { + auto parse = json_->parse(out); FrameData req; req.type = FrameType::TYPE_RESPONSE_SUCCESS; - req.data = new char[out.size()]; - req.len = out.size(); - memcpy(req.data, out.c_str(), out.size()); + req.len = parse.message_content.size() + 1; + req.data = new char[req.len]; + req.protk = parse.prompt_tokens; + req.coptk = parse.completion_tokens; + memcpy(req.data, parse.message_content.c_str(), parse.message_content.size()); + req.data[req.len - 1] = '\0'; send_frame(socket, req); } ask_mutex_.unlock(); @@ -114,5 +136,7 @@ bool Server::send_frame(const std::shared_ptr& socket, Fr } auto send_len = socket->send(asio::buffer(send_data, len)); + + delete[] send_data; return send_len == len; } diff --git a/server.h b/server.h index a99be80..9921d98 100644 --- a/server.h +++ b/server.h @@ -19,6 +19,9 @@ class Server { public: Server(asio::io_context& io_context, short port); + ~Server(); + +public: void start(); void stop();