| | |
| | |
|
| | | #include "logger.h"
|
| | |
|
| | | #define LOGGER "/var/log/ddns_server.log"
|
| | |
|
| | | #define MAX_EVENTS 512
|
| | | #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
|
| | |
| | | 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;
|
| | |
| | | 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;
|
| | |
| | | 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}
|
| | |
| | | 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':
|
| | |
| | | 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;
|
| | | }
|
| | |
|
| | |
| | | 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 */
|
| | |
| | |
|
| | | else /* already connected client socket get data incoming */
|
| | | {
|
| | | if( (rv=read(event_array[i].data.fd, buf, sizeof(buf))) <= 0)
|
| | | clifd = event_array[i].data.fd;
|
| | | memset(buf, 0, sizeof(buf));
|
| | | if( (rv=read(clifd, buf, sizeof(buf))) <= 0)
|
| | | {
|
| | | log_err("socket[%d] read failure or 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_err("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("Domain: %s=>%s\n", buf, ipaddr);
|
| | | }
|
| | | }
|
| | | } /* for(i=0; i<rv; i++) */
|
| | |
| | |
|
| | | if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
| | | {
|
| | | printf("Use socket() to create a TCP socket failure: %s\n", strerror(errno));
|
| | | log_err("Use socket() to create a TCP socket failure: %s\n", strerror(errno));
|
| | | return -1;
|
| | | }
|
| | |
|
| | |
| | | {
|
| | | if (inet_pton(AF_INET, listen_ip, &servaddr.sin_addr) <= 0)
|
| | | {
|
| | | printf("inet_pton() set listen IP address failure.\n");
|
| | | rv = -2;
|
| | | log_err("inet_pton() set listen IP address failure.\n"); |
| | | rv = -2;
|
| | | goto CleanUp;
|
| | | }
|
| | | }
|
| | |
| | |
|
| | | if(bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
|
| | | {
|
| | | printf("Use bind() to bind the TCP socket failure: %s\n", strerror(errno));
|
| | | log_err("Use bind() to bind the TCP socket failure: %s\n", strerror(errno));
|
| | | rv = -3;
|
| | | goto CleanUp;
|
| | | }
|
| | |
|
| | | if(listen(listenfd, 13) < 0)
|
| | | {
|
| | | printf("Use bind() to bind the TCP socket failure: %s\n", strerror(errno));
|
| | | log_err("Use bind() to bind the TCP socket failure: %s\n", strerror(errno));
|
| | | rv = -4;
|
| | | goto CleanUp;
|
| | | }
|
| | |
| | | limit.rlim_cur = limit.rlim_max;
|
| | | setrlimit(RLIMIT_NOFILE, &limit );
|
| | |
|
| | | printf("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);
|
| | | }
|
| | |
|