ZBLOG

用libuv写一个tcp服务器,将接收到客户端的消息缓存起来,在另一个线程中处理客户端消息,并响应客户端消息

以下是一个使用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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=11094

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?