首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有两个客户端的简单libuv服务器在第二个客户端连接后一直在循环中调用写回调。

具有两个客户端的简单libuv服务器在第二个客户端连接后一直在循环中调用写回调。
EN

Stack Overflow用户
提问于 2016-03-06 17:30:05
回答 1查看 475关注 0票数 0

我正在玩libuv,我正在尝试拥有一个简单的服务器,它可以监听本地主机,每当客户机连接时,只需发送一个"Hello“。

问题是,服务器似乎正常工作,但是在第一个连接之后,写回调一直在循环中被调用,永不松手。

下面是一个完整的代码示例。出什么问题了?

代码语言:javascript
复制
#include <iostream>
#include <uv.h>

class Server
{
public:
Server() : m_connectionCount(0)
{
    struct sockaddr_in addr;

    int status = uv_tcp_init(uv_default_loop(), &m_socket);
    if(status)
    {
        exit(1);
    }

    uv_ip4_addr("0.0.0.0", 8888, &addr);

    status = uv_tcp_bind(&m_socket, (const struct sockaddr*) &addr, 0);
    if (status)
    {
        exit(1);
    }

    m_socket.data = this;

    status = uv_listen((uv_stream_t*)&m_socket, 128, [](uv_stream_t* server, int status)
    {
        Server* pServer = (Server*)server->data;
        if(pServer->m_connectionCount >= 2)
            return;

        uv_tcp_t* client = &(pServer->m_connections[pServer->m_connectionCount]);
        int error = uv_tcp_init(uv_default_loop(), client);
        if(error)
            exit(1);

        client->data = pServer;

        error = uv_accept(server, (uv_stream_t*)client);
        if(error)
            exit(1);

        auto allocate = [](uv_handle_t* handle, size_t suggested_size, uv_buf_t* buf)
        {
            buf->base = (char*)malloc(suggested_size);
            buf->len = suggested_size;
        };

        auto onRead = [](uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf)
        {
        };

        error = uv_read_start((uv_stream_t*)client, allocate, onRead);
        if(error)
            return;

        pServer->m_connectionCount++;
        for(size_t i=0; i<pServer->m_connectionCount; ++i)
        {
            uv_stream_t* stream = (uv_stream_t*)&(pServer->m_connections[i]);

            uv_buf_t buffer = {.len = 6, .base = "Hello"};
            uv_write_t req;
            uv_write(&req, stream, &buffer, 1,
                     [](uv_write_t* request, int status)
                     {
                         /*** PROBLEM: After the second client connects this keeps getting called in a loop ... ?***/
                         printf("Write completed\n");
                     });

        }
    });

    if (status)
    {
        exit(1);
    }

    uv_run(uv_default_loop(), UV_RUN_DEFAULT);
}

private:
     uv_tcp_t m_socket;
     uv_tcp_t m_connections[2];
     uint32_t m_connectionCount;
};

int main(int argc, const char * argv[])
{
    Server testServer;
}

不考虑泄漏之类的问题,这仅仅是为了说明写回调问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-06 18:11:24

我想通了。问题是循环中的uv_write_t需要动态分配,这样当它超出范围时就不会被删除。我(错误地)假设请求是复制的。

奇怪的是,缓冲区结构似乎不需要动态分配。

如果其他人遇到这个问题,请发这篇文章。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35830040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档