From 3d9fa10485fc33ab41cd6ecd3d5b334d25f3355e Mon Sep 17 00:00:00 2001 From: Sergey Lyubka Date: Fri, 1 Apr 2022 15:42:15 +0100 Subject: [PATCH] Increase sock limit, fix multiple connections issue --- examples/zephyr/http-server/prj.conf | 6 +-- examples/zephyr/http-server/src/main.c | 1 - mongoose.c | 51 +++++++++----------------- src/event.c | 2 +- 4 files changed, 19 insertions(+), 41 deletions(-) diff --git a/examples/zephyr/http-server/prj.conf b/examples/zephyr/http-server/prj.conf index 1193d7d0..e1ee45b7 100644 --- a/examples/zephyr/http-server/prj.conf +++ b/examples/zephyr/http-server/prj.conf @@ -6,14 +6,10 @@ CONFIG_NET_UDP=y CONFIG_NET_DHCPV4=y CONFIG_NET_SOCKETS=y CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE=32756 +CONFIG_NET_SOCKETS_POLL_MAX=32 CONFIG_NET_LOG=y CONFIG_LOG=y -#CONFIG_NET_TX_STACK_SIZE=2048 -#CONFIG_NET_RX_STACK_SIZE=2048 CONFIG_ISR_STACK_SIZE=2048 CONFIG_MAIN_STACK_SIZE=8192 CONFIG_IDLE_STACK_SIZE=1024 CONFIG_NET_CONFIG_SETTINGS=y -#CONFIG_NET_CONFIG_MY_IPV4_ADDR="169.254.240.10" -#CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.0.0" -#CONFIG_NET_CONFIG_MY_IPV4_GW="169.254.240.5" diff --git a/examples/zephyr/http-server/src/main.c b/examples/zephyr/http-server/src/main.c index 4f0d1f8d..8d478d95 100644 --- a/examples/zephyr/http-server/src/main.c +++ b/examples/zephyr/http-server/src/main.c @@ -52,7 +52,6 @@ static void sfn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { static void timer_fn(void *arg) { struct mg_mgr *mgr = (struct mg_mgr *) arg; - return; if (s_sntp_conn == NULL) s_sntp_conn = mg_sntp_connect(mgr, NULL, sfn, NULL); if (s_boot_timestamp < 9999) mg_sntp_send(s_sntp_conn, time(NULL)); } diff --git a/mongoose.c b/mongoose.c index 4a7752c1..83783c74 100644 --- a/mongoose.c +++ b/mongoose.c @@ -304,7 +304,7 @@ static void dns_cb(struct mg_connection *c, int ev, void *ev_data, (void) fn_data; } -static void mg_dns_send(struct mg_connection *c, const struct mg_str *name, +static bool mg_dns_send(struct mg_connection *c, const struct mg_str *name, uint16_t txnid, bool ipv6) { struct { struct mg_dns_header header; @@ -328,14 +328,7 @@ static void mg_dns_send(struct mg_connection *c, const struct mg_str *name, if (ipv6) pkt.data[n - 3] = 0x1c; // AAAA query // memcpy(&pkt.data[n], "\xc0\x0c\x00\x1c\x00\x01", 6); // AAAA query // n += 6; - mg_send(c, &pkt, sizeof(pkt.header) + n); -#if 0 - // Immediately after A query, send AAAA query. Whatever reply comes first, - // we'll use it. Note: we cannot send two queries in a single packet. - // https://stackoverflow.com/questions/4082081/requesting-a-and-aaaa-records-in-single-dns-query - pkt.data[n - 3] = 0x1c; // AAAA query - mg_send(c, &pkt, sizeof(pkt.header) + n); -#endif + return mg_send(c, &pkt, sizeof(pkt.header) + n); } static void mg_sendnsreq(struct mg_connection *c, struct mg_str *name, int ms, @@ -364,7 +357,9 @@ static void mg_sendnsreq(struct mg_connection *c, struct mg_str *name, int ms, c->is_resolving = 1; MG_VERBOSE(("%lu resolving %.*s @ %s, txnid %hu", c->id, (int) name->len, name->ptr, mg_ntoa(&dnsc->c->rem, buf, sizeof(buf)), d->txnid)); - mg_dns_send(dnsc->c, name, d->txnid, ipv6); + if (!mg_dns_send(dnsc->c, name, d->txnid, ipv6)) { + mg_error(dnsc->c, "DNS send"); + } } } @@ -402,7 +397,7 @@ void mg_error(struct mg_connection *c, const char *fmt, ...) { va_start(ap, fmt); mg_vasprintf(&buf, sizeof(mem), fmt, ap); va_end(ap); - MG_ERROR(("%lu %s", c->id, buf)); + MG_ERROR(("%lu %p %s", c->id, c->fd, buf)); c->is_closing = 1; // Set is_closing before sending MG_EV_CALL mg_call(c, MG_EV_ERROR, buf); // Let user handler to override it if (buf != mem) free(buf); @@ -2776,8 +2771,9 @@ struct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url, c->is_udp = (strncmp(url, "udp:", 4) == 0); c->fn = fn; c->is_client = true; + c->fd = (void *) (size_t) -1; // Set to invalid socket c->fn_data = fn_data; - MG_DEBUG(("%lu -> %s", c->id, url)); + MG_DEBUG(("%lu %p %s", c->id, c->fd, url)); mg_call(c, MG_EV_OPEN, NULL); mg_resolve(c, url); } @@ -2799,7 +2795,7 @@ struct mg_connection *mg_listen(struct mg_mgr *mgr, const char *url, c->fn = fn; c->fn_data = fn_data; mg_call(c, MG_EV_OPEN, NULL); - MG_DEBUG(("%lu %s %p", c->id, url, c->fd)); + MG_DEBUG(("%lu %p %s", c->id, c->fd, url)); } return c; } @@ -3222,25 +3218,6 @@ bool mg_sock_would_block(void) { } static void iolog(struct mg_connection *c, char *buf, long n, bool r) { - int log_level = n > 0 ? MG_LL_VERBOSE : MG_LL_DEBUG; - char flags[] = {(char) ('0' + c->is_listening), - (char) ('0' + c->is_client), - (char) ('0' + c->is_accepted), - (char) ('0' + c->is_resolving), - (char) ('0' + c->is_connecting), - (char) ('0' + c->is_tls), - (char) ('0' + c->is_tls_hs), - (char) ('0' + c->is_udp), - (char) ('0' + c->is_websocket), - (char) ('0' + c->is_hexdumping), - (char) ('0' + c->is_draining), - (char) ('0' + c->is_closing), - (char) ('0' + c->is_readable), - (char) ('0' + c->is_writable), - '\0'}; - MG_LOG(log_level, - ("%lu %s %d:%d %ld err %d (%s)", c->id, flags, (int) c->send.len, - (int) c->recv.len, n, MG_SOCK_ERRNO, strerror(errno))); if (n == 0) { // Do nothing } else if (n < 0) { @@ -3289,6 +3266,8 @@ static long mg_sock_send(struct mg_connection *c, const void *buf, size_t len) { bool mg_send(struct mg_connection *c, const void *buf, size_t len) { if (c->is_udp) { long n = mg_sock_send(c, buf, len); + MG_DEBUG(("%lu %p %d:%d %ld err %d (%s)", c->id, c->fd, (int) c->send.len, + (int) c->recv.len, n, MG_SOCK_ERRNO, strerror(errno))); iolog(c, (char *) buf, n, false); return n > 0; } else { @@ -3402,6 +3381,8 @@ static long read_conn(struct mg_connection *c) { char *buf = (char *) &c->recv.buf[c->recv.len]; size_t len = c->recv.size - c->recv.len; n = c->is_tls ? mg_tls_recv(c, buf, len) : mg_sock_recv(c, buf, len); + MG_DEBUG(("%lu %p %d:%d %ld err %d (%s)", c->id, c->fd, (int) c->send.len, + (int) c->recv.len, n, MG_SOCK_ERRNO, strerror(errno))); iolog(c, buf, n, true); } return n; @@ -3411,6 +3392,8 @@ static void write_conn(struct mg_connection *c) { char *buf = (char *) c->send.buf; size_t len = c->send.len; long n = c->is_tls ? mg_tls_send(c, buf, len) : mg_sock_send(c, buf, len); + MG_DEBUG(("%lu %p %d:%d %ld err %d (%s)", c->id, c->fd, (int) c->send.len, + (int) c->recv.len, n, MG_SOCK_ERRNO, strerror(errno))); iolog(c, buf, n, false); } @@ -3487,6 +3470,7 @@ void mg_connect_resolved(struct mg_connection *c) { mg_error(c, "connect: %d", MG_SOCK_ERRNO); } } + MG_DEBUG(("%lu %p", c->id, c->fd)); } static void accept_conn(struct mg_mgr *mgr, struct mg_connection *lsn) { @@ -3636,13 +3620,12 @@ static void mg_iotest(struct mg_mgr *mgr, int ms) { } if ((rc = select((int) maxfd + 1, &rset, &wset, NULL, &tv)) < 0) { - MG_DEBUG(("select: %d %d", rc, MG_SOCK_ERRNO)); + MG_ERROR(("select: %d %d", rc, MG_SOCK_ERRNO)); FD_ZERO(&rset); FD_ZERO(&wset); } for (c = mgr->conns; c != NULL; c = c->next) { - // TLS might have stuff buffered, so dig everything c->is_readable = FD(c) != INVALID_SOCKET && FD_ISSET(FD(c), &rset); c->is_writable = FD(c) != INVALID_SOCKET && FD_ISSET(FD(c), &wset); } diff --git a/src/event.c b/src/event.c index 02102a97..0e5391b9 100644 --- a/src/event.c +++ b/src/event.c @@ -17,7 +17,7 @@ void mg_error(struct mg_connection *c, const char *fmt, ...) { va_start(ap, fmt); mg_vasprintf(&buf, sizeof(mem), fmt, ap); va_end(ap); - MG_ERROR(("%lu %s", c->id, buf)); + MG_ERROR(("%lu %p %s", c->id, c->fd, buf)); c->is_closing = 1; // Set is_closing before sending MG_EV_CALL mg_call(c, MG_EV_ERROR, buf); // Let user handler to override it if (buf != mem) free(buf);