以下是一个使用libuv库编写的TCP服务器示例,它将接收到的客户端消息缓存起来,并在另一个线程中处理并响应客户端消息:
#include <iostream>
#include <string>
#include <thread>
#include <vector>
#include <uv.h>
// 存储客户端消息的缓存
std::vector<std::string> messageCache;
// TCP连接上下文结构体
struct ConnectionContext {
uv_tcp_t handle; // 连接句柄
uv_buf_t buffer; // 接收数据缓冲区
};
// 线程函数,用于处理客户端消息并响应
void processMessages() {
while (true) {
if (!messageCache.empty()) {
std::string message = messageCache.front();
messageCache.erase(messageCache.begin());
// 在这里对消息进行处理和响应逻辑
std::cout << "Received and processed message: " << message << std::endl;
}
else {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
}
// 读取数据回调函数
void onRead(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
ConnectionContext* context = reinterpret_cast<ConnectionContext*>(stream->data);
if (nread > 0) {
// 将接收到的数据存入消息缓存中
std::string message(buf->base, nread);
messageCache.push_back(message);
}
delete[] buf->base;
}
// 新连接回调函数
void onConnect(uv_stream_t* server, int status) {
if (status < 0) {
std::cerr << "Error on new connection: " << uv_strerror(status) << std::endl;
return;
}
// 初始化连接上下文
ConnectionContext* context = new ConnectionContext();
context->handle.data = context;
// 初始化接收数据缓冲区
char* buffer = new char[1024];
context->buffer = uv_buf_init(buffer, 1024);
// 接受新连接
uv_tcp_t* client = new uv_tcp_t();
uv_tcp_init(uv_default_loop(), client);
if (uv_accept(server, reinterpret_cast<uv_stream_t*>(client)) == 0) {
uv_read_start(reinterpret_cast<uv_stream_t*>(client), [](uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf) {
ConnectionContext* ctx = reinterpret_cast<ConnectionContext*>(handle->data);
*buf = ctx->buffer;
}, onRead);
}
}
int main() {
uv_loop_t loop;
// 初始化libuv事件循环
uv_loop_init(&loop);
// 创建服务器TCP句柄
uv_tcp_t server;
uv_tcp_init(&loop, &server);
// 绑定服务器地址和端口
struct sockaddr_in bind_addr;
uv_ip4_addr("0.0.0.0", 8888, &bind_addr);
uv_tcp_bind(&server, reinterpret_cast<const struct sockaddr*>(&bind_addr), 0);
// 监听新连接请求
int r = uv_listen(reinterpret_cast<uv_stream_t*>(&server), SOMAXCONN, onConnect);
if (r != 0) {
std::cerr << "Listen error: " << uv_strerror(r) << std::endl;
return 1;
}
// 创建处理消息的线程
std::thread messageThread(processMessages);
// 运行事件循环
uv_run(&loop, UV_RUN_DEFAULT);
// 清理资源
uv_loop_close(&loop);
messageThread.join();
return 0;
}
上述示例代码演示了一个使用libuv库编写的简单TCP服务器。它接受客户端连接并将接收到的消息存入缓存中,然后在另一个线程中处理和响应这些消息。请根据实际需求进行修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问




