Libuv C - uv_tcp_connect с потоковой передачей - PullRequest
0 голосов
/ 02 августа 2020

У меня нет большого опыта в настройке серверов на C, поэтому я решил попробовать установить простое TCP-соединение на локальном компьютере.

Я просто пытаюсь настроить сервер связи между сервером и клиентом в одном коде, то есть я не хочу запускать «Сервер», а затем «Клиент». Пример, который я использую, взят из документации libuv

Я думал использовать для этого 2 разных потока, но с этим должно быть что-то не так, вот что происходит:

Я запускаю основную функцию int main ():

uv_rwlock_init(&numlock);

    uv_thread_t server_id;
    uv_thread_t client_id;
    
    uv_thread_create(&server_id, server_t, &numlock);
    uv_thread_create(&client_id, client_t, &numlock);

    uv_thread_join(&server_id);
    uv_thread_join(&client_id);

    uv_rwlock_destroy(&numlock);

, которая вызывает функции server_t и client_t в двух разных потоках. Он запускается нормально, но затем он вылетает на uv_tcp_connect с ошибкой: uv_read_start: утверждение `alloc_cb 'не удалось.

Вот полный код для client_t () :

void client_t(void *arg)
{   
    int ret = 0;
    uv_rwlock_t numlock = *((uv_rwlock_t *) arg);
    // Variables
    uv_tcp_t socket;
    uv_tcp_init(uv_default_loop(), &socket);

    struct sockaddr_in dest;
    uv_ip4_addr("127.0.0.1", 8000, &dest);
    uv_rwlock_rdlock(&numlock);

    uv_connect_t connect;
    ret = uv_tcp_connect(&connect, &socket, (struct sockaddr *) &dest, on_connect);
    uv_run(uv_default_loop(), UV_RUN_ONCE);

    uv_rwlock_wrunlock(&numlock);

    return;
}

и полный код для server_t ():

void server_t(void *arg)
{   
    _loop_server = uv_default_loop();
    struct sockaddr_in addr;

    uv_tcp_t server;
    uv_tcp_init(_loop_server, &server);

    uv_ip4_addr("127.0.0.1", 8000, &addr);

    uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0);
    int r = uv_listen((uv_stream_t*) &server, 0, on_new_connection);
    if (r) {
        fprintf(stderr, "Listen error %s\n", uv_strerror(r));
        return;
    }
    uv_run(_loop_server, UV_RUN_DEFAULT);

    return;
}

Я, вероятно, здесь что-то в корне делаю неправильно. Надеюсь, кто-нибудь из вас сможет помочь

...