From 8a383b8715fc07145fdc3f3e3dbe6ecd93f72989 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Sun, 07 Jun 2020 00:06:57 +0800 Subject: [PATCH] update tlv_server program, add TLV parser support --- app_ddns/ddns_server.c | 56 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 44 insertions(+), 12 deletions(-) diff --git a/app_ddns/ddns_server.c b/app_ddns/ddns_server.c index 6d2fa2c..ffd3d67 100644 --- a/app_ddns/ddns_server.c +++ b/app_ddns/ddns_server.c @@ -17,7 +17,6 @@ #include "logger.h" -#define LOGGER "/tmp/ddns_server.log" #define MAX_EVENTS 512 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) @@ -29,7 +28,7 @@ int main(int argc, char **argv) { int listenfd, connfd; - int serv_port = 0; + int serv_port = 10001; int daemon_run = 0; char *progname = NULL; int opt; @@ -37,6 +36,13 @@ int i, j; int found; char buf[1024]; + int debug = 0; + char *logger_file="/tmp/ddns_server.log"; + + struct sockaddr_in cliaddr; + socklen_t addrlen=sizeof(cliaddr); + int clifd; + char ipaddr[16]; int epollfd; struct epoll_event event; @@ -46,6 +52,7 @@ struct option long_options[] = { {"daemon", no_argument, NULL, 'b'}, + {"debug", no_argument, NULL, 'd'}, {"port", required_argument, NULL, 'p'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} @@ -54,12 +61,16 @@ progname = basename(argv[0]); /* Parser the command line parameters */ - while ((opt = getopt_long(argc, argv, "bp:h", long_options, NULL)) != -1) + while ((opt = getopt_long(argc, argv, "bdp:h", long_options, NULL)) != -1) { switch (opt) { case 'b': daemon_run=1; + break; + + case 'd': + debug=1; break; case 'p': @@ -81,9 +92,12 @@ return -1; } - if( logger_init(LOGGER, LOG_LEVEL_DEBUG, 10) < 0 ) + if( debug ) + logger_file = DBG_LOG_FILE; + + if( logger_init(logger_file, LOG_LEVEL_NRML, 10) < 0 ) { - printf("initial logger file '%s' failure\n", LOGGER); + printf("initial logger file '%s' failure\n", logger_file); return 0; } @@ -94,7 +108,7 @@ log_err("ERROR: %s server listen on port %d failure\n", argv[0],serv_port); return -2; } - log_dbg("%s server start to listen on port %d\n", argv[0],serv_port); + log_nrml("%s server start to listen on port %d\n", argv[0],serv_port); /* set program running on background */ @@ -167,17 +181,35 @@ else /* already connected client socket get data incoming */ { + clifd = event_array[i].data.fd; memset(buf, 0, sizeof(buf)); - if( (rv=read(event_array[i].data.fd, buf, sizeof(buf))) <= 0) + if( (rv=read(clifd, buf, sizeof(buf))) <= 0) { - log_err("socket[%d] already get disconncet and will be removed.\n", event_array[i].data.fd); - epoll_ctl(epollfd, EPOLL_CTL_DEL, event_array[i].data.fd, NULL); - close(event_array[i].data.fd); + log_dbg("socket[%d] already get disconncet and will be removed.\n", clifd); + epoll_ctl(epollfd, EPOLL_CTL_DEL, clifd, NULL); + close(clifd); continue; } else { - log_dbg("socket[%d] read get %d bytes data: %s\n", event_array[i].data.fd, rv, buf); + log_dbg("socket[%d] read get %d bytes data: %s\n", clifd, rv, buf); + + /* get socket client IP address information */ + if( getpeername(clifd, (struct sockaddr *)&cliaddr, &addrlen) < 0 ) + { + log_err("getpeername get socket client[%d] IP address failure: %s\n", clifd, strerror(errno)); + continue; + } + + memset(ipaddr, 0, sizeof(ipaddr)); + if( !inet_ntop(AF_INET, &cliaddr.sin_addr, ipaddr, sizeof(ipaddr)) ) + { + log_err("convert sockaddr to IP address character string failure: %s\n", strerror(errno)); + continue; + } + + + log_nrml("<<<<< %s => '%s' >>>>>\n", buf, ipaddr); } } } /* for(i=0; i<rv; i++) */ @@ -273,6 +305,6 @@ limit.rlim_cur = limit.rlim_max; setrlimit(RLIMIT_NOFILE, &limit ); - log_dbg("set socket open fd max count to %d\n", (int)limit.rlim_max); + log_nrml("set socket open fd max count to %d\n", (int)limit.rlim_max); } -- Gitblit v1.9.1