APUE Learning Example Source Code
guowenxue
2020-01-01 5c07107b73c234ef1f80a92abe795bf3f5c7050f
app_ddns/ddns_server.c
@@ -17,7 +17,6 @@
#include "logger.h"
#define LOGGER              "/var/log/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,16 +181,35 @@
            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_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++) */ 
@@ -214,7 +247,7 @@
    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;
    }
@@ -233,8 +266,8 @@
    {
        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;
        }
    }
@@ -242,14 +275,14 @@
    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;
    }
@@ -272,6 +305,6 @@
     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);
}