summaryrefslogtreecommitdiff
path: root/access/src/udp_server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'access/src/udp_server.cpp')
-rw-r--r--access/src/udp_server.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/access/src/udp_server.cpp b/access/src/udp_server.cpp
new file mode 100644
index 0000000..f8a0d76
--- /dev/null
+++ b/access/src/udp_server.cpp
@@ -0,0 +1,52 @@
+#include "mgw_utils.h"
+#include "mgw_socket.h"
+#include "udp_server.h"
+#include "nat.h"
+#include "mgw_tun.h"
+
+void * thread_udp_server(void *args)
+{
+ struct udp_server_args *_args = (struct udp_server_args *)args;
+ void *logger = _args->logger;
+ const char *profile = _args->profile;
+ struct nat_handle *_nat_handle = _args->_nat_handle;
+ struct mgw_tun_handle *tun_handle = _args->tun_handle;
+ const char *section = "udp_server";
+ char ip[MGW_SYMBOL_MAX];
+ u_int16_t port;
+ MESA_load_profile_string_def(profile, section, "ip", ip, MGW_SYMBOL_MAX, "192.168.11.137");
+ MESA_load_profile_int_def(profile, section, "port", (int *)&port, 33456);
+ MGW_LOG_INFO(logger, "MESA_prof_load, [%s]:\n ip: %s\n port: %d", "udp_server", ip, port);
+ int socket_fd = mgw_socket_init();
+ if(socket_fd < 0)
+ {
+ MGW_LOG_ERROR(logger, "mgw_socket: Failed at create socket, errno is %d, %s", errno, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ int rtn = mgw_socket_bind(socket_fd, ip, port);
+ if(rtn < 0)
+ {
+ MGW_LOG_ERROR(logger, "mgw_socket: Failed at bind, ip is %s, port is %d, errno is %d, %s", ip, port, errno, strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ char buff[MGW_PACKET_MAX];
+ while(1)
+ {
+ //EAGAIN if socket is no-blocking, eg. fcntl()
+ int len = mgw_socket_udp_recv(socket_fd, buff);
+ if (len < 0)
+ {
+ MGW_LOG_ERROR(logger, "mgw_socket: Failed at recv udp data, errno is %d, %s", errno, strerror(errno));
+ continue;
+ }
+ MGW_LOG_INFO(logger, "mgw_socket: Succeed to recv udp data, len is %d", len);
+ int rtn = nat_dest_convert(_nat_handle, buff, len);
+ if(rtn == NAT_COVERT_FAILURE)
+ {
+ MGW_LOG_ERROR(logger, "Failed to nat_dest_convert");
+ continue;
+ }
+ //write to tun
+ mgw_tun_write(tun_handle, buff, len);
+ }
+} \ No newline at end of file