diff --git a/examples/multi_threaded_server/multi_threaded_server.c b/examples/multi_threaded_server/multi_threaded_server.c index 9e45fb3cf0d5dcef4cf2da47c1dbf4d4a16a5e29..30af3f10807308aa38162afd167bfd88cf68ed61 100644 --- a/examples/multi_threaded_server/multi_threaded_server.c +++ b/examples/multi_threaded_server/multi_threaded_server.c @@ -26,9 +26,9 @@ int main(void) { server1 = mg_create_server((void *) "1", ev_handler); server2 = mg_create_server((void *) "2", ev_handler); - // Make both server1 and server2 listen on the same socket + // Make both server1 and server2 listen on the same sockets mg_set_option(server1, "listening_port", "8080"); - //mg_set_listening_socket(server2, mg_get_listening_socket(server1)); + mg_copy_listeners(server1, server2); // server1 goes to separate thread, server 2 runs in main thread. // IMPORTANT: NEVER LET DIFFERENT THREADS HANDLE THE SAME SERVER. diff --git a/mongoose.c b/mongoose.c index 76efa7a3bfefe46506c993b31b2804500fb4c6c1..8fe7b674d7a09b7783b7afd6591b4e81f4267a61 100644 --- a/mongoose.c +++ b/mongoose.c @@ -4807,9 +4807,8 @@ void mg_destroy_server(struct mg_server **server) { } struct mg_connection *mg_next(struct mg_server *s, struct mg_connection *c) { - struct connection *conn = MG_CONN_2_CONN(c); - struct ns_connection *nc = ns_next(&s->ns_mgr, - c == NULL ? NULL : conn->ns_conn); + struct ns_connection *nc = ns_next(&s->ns_mgr, c == NULL ? NULL : + MG_CONN_2_CONN(c)->ns_conn); if (nc != NULL && nc->user_data != NULL) { return & ((struct connection *) nc->user_data)->mg_conn; } else { @@ -4923,6 +4922,18 @@ const char **mg_get_valid_option_names(void) { return static_config_options; } +void mg_copy_listeners(struct mg_server *s, struct mg_server *to) { + struct ns_connection *c; + for (c = ns_next(&s->ns_mgr, NULL); c != NULL; c = ns_next(&s->ns_mgr, c)) { + struct ns_connection *tmp; + if ((c->flags & NSF_LISTENING) && (tmp = malloc(sizeof(*tmp))) != NULL) { + memcpy(tmp, c, sizeof(*tmp)); + tmp->mgr = &to->ns_mgr; + ns_add_conn(tmp->mgr, tmp); + } + } +} + static int get_option_index(const char *name) { int i; @@ -5209,19 +5220,6 @@ void mg_wakeup_server(struct mg_server *server) { ns_broadcast(&server->ns_mgr, NULL, (void *) "", 0); } -#if 0 -void mg_set_listening_socket(struct mg_server *server, int sock) { - if (server->ns_mgr.listening_sock != INVALID_SOCKET) { - closesocket(server->ns_mgr.listening_sock); - } - server->ns_mgr.listening_sock = (sock_t) sock; -} - -int mg_get_listening_socket(struct mg_server *server) { - return server->ns_mgr.listening_sock; -} -#endif - const char *mg_get_option(const struct mg_server *server, const char *name) { const char **opts = (const char **) server->config_options; int i = get_option_index(name); diff --git a/mongoose.h b/mongoose.h index 55009fac95375e7fff722db420b587324f79b892..82b143bcf6ffa3f97b29dbf15c049d24faab4c83 100644 --- a/mongoose.h +++ b/mongoose.h @@ -93,8 +93,7 @@ const char *mg_set_option(struct mg_server *, const char *opt, const char *val); int mg_poll_server(struct mg_server *, int milliseconds); const char **mg_get_valid_option_names(void); const char *mg_get_option(const struct mg_server *server, const char *name); -void mg_set_listening_socket(struct mg_server *, int sock); -int mg_get_listening_socket(struct mg_server *); +void mg_copy_listeners(struct mg_server *from, struct mg_server *to); struct mg_connection *mg_next(struct mg_server *, struct mg_connection *); void mg_wakeup_server(struct mg_server *); void mg_wakeup_server_ex(struct mg_server *, mg_handler_t, const char *, ...);