【问题标题】:libuv tcp connections issuelibuv tcp 连接问题
【发布时间】:2014-03-29 14:45:04
【问题描述】:

我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include "uv.h"

int64_t counter = 0;

void on_new_connection(uv_stream_t *server, int status);

int main(void)
{
    uv_tcp_t server;
    uv_tcp_init(uv_default_loop(), &server);

    struct sockaddr_in socket;

    uv_ip4_addr("127.0.0.1", 7000, &socket);
    uv_tcp_bind(&server, (struct sockaddr *) &socket, 42);
    int r = uv_listen((uv_stream_t*) &server, 128,
            on_new_connection);
    if (r) {
        fprintf(stderr, "Listen error\n");
        return 1;
    }

    return uv_run(uv_default_loop(), UV_RUN_DEFAULT);
}

void on_new_connection(uv_stream_t *server, int status)
{
    printf("new connection\n");

    if (status == -1) {
        return;
    }

    uv_tcp_t *client = malloc(sizeof(uv_tcp_t));
    uv_tcp_init(uv_default_loop(), client);
//  if (uv_accept(server, (uv_stream_t*) client) == 0) {
//      uv_read_start((uv_stream_t*) client, alloc_buffer, echo_read);
//  }
//  else {
//      uv_close((uv_handle_t*) client, NULL);
//  }
}

我只想启动这个服务器并(通过 telnet 或浏览器)连接到这个服务器。 一切似乎都很好,除了第一个连接总是在on_new_connection 中打印“新连接”字符串,但我开始的任何新 telnet 会话都不会打印新连接。 我错过了什么?好像 on_new_connection 回调只调用了一次,为什么?

【问题讨论】:

    标签: c tcp libuv


    【解决方案1】:

    你为什么注释掉调用uv_accept()的代码?在连接回调中,用户必须调用uv_accept() 来接受挂起的连接。然后在此调用之后恢复服务器 i/o 观察程序。在您的情况下,观察者不会恢复。这就是您观察单个回调的原因。

    【讨论】:

      【解决方案2】:

      可能,您没有使用 telnet 指定正确的端口?

      远程登录 127.0.0.1 7000

      【讨论】:

        【解决方案3】:

        您也没有检查状态值。您总是会收到回调,但您不知道这是否是某种错误

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-09
          • 1970-01-01
          • 2016-08-13
          • 2017-10-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多