我有以下代码:
#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回调只被调用一次,为什么?
答案 0 :(得分:1)
为什么要通过调用uv_accept()
来注释掉代码?在连接回调中,用户必须调用uv_accept()
以接受挂起的连接。然后在此调用之后恢复服务器i / o观察器。在你的情况下,观察者不会恢复。这就是你观察一次回调的原因。
答案 1 :(得分:0)
可能您没有使用telnet指定正确的端口?
telnet 127.0.0.1 7000
答案 2 :(得分:0)
您还没有检查状态值。你总是得到回调,但你不知道它是否是某种错误