У меня нет большого опыта в настройке серверов на 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;
}
Я, вероятно, здесь что-то в корне делаю неправильно. Надеюсь, кто-нибудь из вас сможет помочь