1 year ago

#126165

test-img

Tyson X

How to create or manage Libuv TCP server in a c++ fuction?

I am trying to create a TCP server in a function int create_server(int port_number, char ip_addr_string[IPV4_ADDR_SIZE]) which is called in main.

When I run the c++ code given below: Assertion failed: (w->fd >= 0), function uv__io_poll, file kqueue.c, line 149.

#include <iostream>
#include <vector>
#include <algorithm>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <future>
#include <sys/types.h>
#include <uv.h>
#define IPV4_ADDR_SIZE 15

uv_loop_t* loop;
struct sockaddr_in addr;
std::map <int, uv_tcp_t * > pool;


int create_tunnel(int port_number, char ip_addr_string[IPV4_ADDR_SIZE]){

uv_tcp_t global_server;
uv_tcp_init(loop, &global_server);
uv_ip4_addr("0.0.0.0", port_number, &addr);
uv_tcp_bind(&global_server, (const struct sockaddr *)&addr, 0);
int r = uv_listen((uv_stream_t *)&global_server, 128, NULL);

if(r){
    fprintf(stderr, "Listen error: %s \n", uv_strerror(r));
}
else{
    fprintf(stdout, "Listening on: %d \n", port_number);
}

pool[rand()] = &global_server;

 return r;
}



int main(int argc, const char *argv[]){
   int status = 1;
   loop = uv_default_loop();
   uv_loop_init(loop);

   loop->data = &pool;
   status = create_tunnel(7011, (char*)"0.0.0.0");

   std::cout<< "status: " << status << std::endl;
 
   uv_run(loop, UV_RUN_DEFAULT);
   return 0;

I think this error is because the servers created are not tracked by the event_loop when the create_server function ends, but I am not sure.

Any help, please?

c++

sockets

event-loop

libuv

kqueue

0 Answers

Your Answer

Accepted video resources