From 0efa8f9d3f909b7efa7818e109c81a138ba4d316 Mon Sep 17 00:00:00 2001
From: Alexander Alashkin <alexander.alashkin@cesanta.com>
Date: Mon, 11 Apr 2016 09:41:50 +0100
Subject: [PATCH] Add UDP echo server Mongoose example

PUBLISHED_FROM=c0ea72104da23a97c81c9f671c9b91d9df2541d1
---
 examples/udp_echo_server/Makefile      |  2 +
 examples/udp_echo_server/echo_server.c | 55 ++++++++++++++++++++++++++
 2 files changed, 57 insertions(+)
 create mode 100644 examples/udp_echo_server/Makefile
 create mode 100644 examples/udp_echo_server/echo_server.c

diff --git a/examples/udp_echo_server/Makefile b/examples/udp_echo_server/Makefile
new file mode 100644
index 000000000..87a88cdfc
--- /dev/null
+++ b/examples/udp_echo_server/Makefile
@@ -0,0 +1,2 @@
+PROG = echo_server
+include ../examples.mk
diff --git a/examples/udp_echo_server/echo_server.c b/examples/udp_echo_server/echo_server.c
new file mode 100644
index 000000000..ddbdd4249
--- /dev/null
+++ b/examples/udp_echo_server/echo_server.c
@@ -0,0 +1,55 @@
+// Copyright (c) 2016 Cesanta Software Limited
+// All rights reserved
+//
+// This software is dual-licensed: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation. For the terms of this
+// license, see <http://www.gnu.org/licenses/>.
+//
+// You are free to use this software under the terms of the GNU General
+// Public License, but WITHOUT ANY WARRANTY; without even the implied
+// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// Alternatively, you can license this software under a commercial
+// license, as set out in <https://www.cesanta.com/license>.
+//
+
+#include "mongoose.h"
+
+static void ev_handler(struct mg_connection *nc, int ev, void *p) {
+  struct mbuf *io = &nc->recv_mbuf;
+  (void) p;
+  switch (ev) {
+    case MG_EV_RECV:
+      mg_send(nc, io->buf, io->len);   // Echo message back
+      mbuf_remove(io, io->len);        // Discard message from recv buffer
+      // In case of UDP, Mongoose creates new virtual connection for
+      // incoming messages
+      // We can keep it (and it will be reused for another messages from
+      // the same address) or we can close it (this saves some memory, but
+      // decreases perfomance, because it forces creation of connection
+      // for every incoming dgram)
+      nc->flags |= MG_F_SEND_AND_CLOSE;
+      break;
+    default:
+      break;
+  }
+}
+
+int main(void) {
+  struct mg_mgr mgr;
+  const char *port1 = "udp://1234", *port2 = "udp://127.0.0.1:17000";
+
+  mg_mgr_init(&mgr, NULL);
+  mg_bind(&mgr, port1, ev_handler);
+  mg_bind(&mgr, port2, ev_handler);
+
+  printf("Starting echo mgr on ports %s, %s\n", port1, port2);
+  for (;;) {
+    mg_mgr_poll(&mgr, 1000);
+  }
+  mg_mgr_free(&mgr);
+
+  return 0;
+}
-- 
GitLab