Structure must be shared

This commit is contained in:
Quentin Dufour 2019-02-19 15:17:47 +01:00
parent a4c3018c79
commit 40dbd44da5
4 changed files with 39 additions and 13 deletions

View file

@ -225,7 +225,7 @@ void on_udp_read(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) {
printf("A full UDP packet has been read from UDP\n"); printf("A full UDP packet has been read from UDP\n");
// 3. A whole packet has been read, we will find someone to write it // 3. A whole packet has been read, we will find someone to write it
sprintf(url, "tcp:write:127.0.0.1:7500"); sprintf(url, "tcp:write:127.0.0.1:7503");
to_fdinfo = evt_core_get_from_url (ctx, url); to_fdinfo = evt_core_get_from_url (ctx, url);
if (to_fdinfo == NULL) goto co_error; if (to_fdinfo == NULL) goto co_error;

View file

@ -110,33 +110,45 @@ on_socks5_err:
init_tcp_client (app_ctx, pos); init_tcp_client (app_ctx, pos);
} }
void free_udp_t(void* v) {
struct udp_target* udp_t = v;
udp_t->ref_count--;
if (udp_t <= 0) {
free(udp_t);
}
}
void init_udp_socket(char* port, struct donar_client_ctx* ctx) { void init_udp_socket(char* port, struct donar_client_ctx* ctx) {
int sock1, sock2; int sock1, sock2;
char url[1024]; char url[1024];
struct evt_core_cat cat = {0}; struct evt_core_cat cat = {0};
struct evt_core_fdinfo fdinfo = {0}; struct evt_core_fdinfo fdinfo = {0};
// 1. Init shared parameters for the fdinfo structure
struct udp_target* udp_t = malloc(sizeof(struct udp_target));
if (udp_t == NULL) goto socket_failed;
memset(udp_t, 0, sizeof(struct udp_target));
udp_t->ref_count = 2;
fdinfo.cat = &cat; fdinfo.cat = &cat;
fdinfo.url = url; fdinfo.url = url;
fdinfo.free_other = evt_core_free_app_ctx_simple; fdinfo.free_other = free_udp_t;
fdinfo.other = udp_t;
// 2. Duplicate sockets
sock1 = create_udp_server (port); sock1 = create_udp_server (port);
if (sock1 < 0) goto socket_failed; if (sock1 < 0) goto socket_failed;
sock2 = dup(sock1); sock2 = dup(sock1);
if (sock2 < 0) goto socket_failed; if (sock2 < 0) goto socket_failed;
// 3. Register them
fdinfo.cat->name = "udp-read"; fdinfo.cat->name = "udp-read";
fdinfo.fd = sock1; fdinfo.fd = sock1;
fdinfo.other = malloc(sizeof(struct udp_target));
if (fdinfo.other == NULL) goto socket_failed;
memset(fdinfo.other, 0, sizeof(struct udp_target));
sprintf(fdinfo.url, "udp:read:127.0.0.1:%s", port); sprintf(fdinfo.url, "udp:read:127.0.0.1:%s", port);
evt_core_add_fd (&(ctx->evts), &fdinfo); evt_core_add_fd (&(ctx->evts), &fdinfo);
fdinfo.cat->name = "udp-write"; fdinfo.cat->name = "udp-write";
fdinfo.fd = sock2; fdinfo.fd = sock2;
fdinfo.other = malloc(sizeof(struct udp_target));
if (fdinfo.other == NULL) goto socket_failed;
memset(fdinfo.other, 0, sizeof(struct udp_target));
sprintf(fdinfo.url, "udp:write:127.0.0.1:%s", port); sprintf(fdinfo.url, "udp:write:127.0.0.1:%s", port);
evt_core_add_fd (&(ctx->evts), &fdinfo); evt_core_add_fd (&(ctx->evts), &fdinfo);
return; return;

View file

@ -50,14 +50,31 @@ socket_create_err:
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
void free_udp_ts(void* v) {
struct udp_target* udp_t = v;
udp_t->ref_count--;
if (udp_t <= 0) {
free(udp_t);
}
}
void serv_init_udp_socket(char* port, struct donar_server_ctx* ctx) { void serv_init_udp_socket(char* port, struct donar_server_ctx* ctx) {
int sock1, sock2; int sock1, sock2;
char url[1024]; char url[1024];
struct evt_core_cat cat = {0}; struct evt_core_cat cat = {0};
struct evt_core_fdinfo fdinfo = {0}; struct evt_core_fdinfo fdinfo = {0};
// 1. Init shared parameters for the fdinfo structure
struct udp_target* udp_t = malloc(sizeof(struct udp_target));
if (udp_t == NULL) goto socket_failed;
memset(udp_t, 0, sizeof(struct udp_target));
udp_t->ref_count = 2;
fdinfo.cat = &cat; fdinfo.cat = &cat;
fdinfo.url = url; fdinfo.url = url;
fdinfo.free_other = evt_core_free_app_ctx_simple; fdinfo.free_other = free_udp_ts;
fdinfo.other = udp_t;
sock1 = create_udp_client ("127.0.0.1", port); sock1 = create_udp_client ("127.0.0.1", port);
if (sock1 < 0) goto socket_failed; if (sock1 < 0) goto socket_failed;
@ -66,15 +83,11 @@ void serv_init_udp_socket(char* port, struct donar_server_ctx* ctx) {
fdinfo.fd = sock1; fdinfo.fd = sock1;
fdinfo.cat->name = "udp-read"; fdinfo.cat->name = "udp-read";
fdinfo.other = malloc(sizeof(struct udp_target));
if (fdinfo.other == NULL) goto socket_failed;
sprintf(fdinfo.url, "udp:read:127.0.0.1:%s", port); sprintf(fdinfo.url, "udp:read:127.0.0.1:%s", port);
evt_core_add_fd (&(ctx->evts), &fdinfo); evt_core_add_fd (&(ctx->evts), &fdinfo);
fdinfo.fd = sock2; fdinfo.fd = sock2;
fdinfo.cat->name = "udp-write"; fdinfo.cat->name = "udp-write";
fdinfo.other = malloc(sizeof(struct udp_target));
if (fdinfo.other == NULL) goto socket_failed;
sprintf(fdinfo.url, "udp:write:127.0.0.1:%s", port); sprintf(fdinfo.url, "udp:write:127.0.0.1:%s", port);
evt_core_add_fd (&(ctx->evts), &fdinfo); evt_core_add_fd (&(ctx->evts), &fdinfo);

View file

@ -54,6 +54,7 @@ struct udp_target {
struct sockaddr_in addr; struct sockaddr_in addr;
socklen_t addrlen; socklen_t addrlen;
int set; int set;
int ref_count;
}; };
enum FD_STATE read_packet_from_tcp(int fd, struct buffer_packet* bp); enum FD_STATE read_packet_from_tcp(int fd, struct buffer_packet* bp);