GuoWenxue
2022-04-19 ea435789dc2fab30ec16fa765a0b6577fe08166a
update client and socket.c, add DNS support
2 files modified
97 ■■■■ changed files
apue/project_socket/main/client_main.c 13 ●●●● patch | view | raw | blame | history
apue/project_socket/src/socket.c 84 ●●●● patch | view | raw | blame | history
apue/project_socket/main/client_main.c
@@ -35,7 +35,6 @@
int main(int argc, char **argv)
{
    int                  rv = -1;
    int                  pr_times = 0;
    int                  port;
    char                *serverip;
    int                  interval = 30; /* default report termperature every 30 seconds */
@@ -110,7 +109,7 @@
        /* set logger to $logfile with level info */
        if( logger_init(logfile, LOG_LEVEL_INFO) < 0 )
        {
            fprintf(stderr, "Initial logger file '%s' failure: %s\n", strerror(errno));
            fprintf(stderr, "Initial logger file '%s' failure: %s\n", logfile, strerror(errno));
            return 1;
        }
@@ -163,24 +162,18 @@
        /* start connect to server if not connected */
        if( sock.fd < 0 )
        {
            if( 0 == (pr_times % 10) )
            {
                log_info("socket not connect, start connect it now.\n");
            }
            socket_connect(&sock);
        }
        /* check socket connected or not  */
        if( sock_check_connect(sock.fd) < 0 )
        {
            pr_times ++;
            if( 0 == (pr_times % 10) )
            if( sock.fd > 0 )
            {
                log_error("socket got disconnected, terminate it and reconnect now.\n");
                pr_times = 0;
            }
            socket_term(&sock); /* close the soket */
        }
        }
        /* socket disconnected */
        if( sock.fd < 0 )
apue/project_socket/src/socket.c
@@ -85,7 +85,7 @@
}
/*  description: socket check connected or not
/*  description: socket connect to server in block mode
 *   input args: 
 *               $sock:  socket context pointer
 * return value: <0: failure   0:ok
@@ -95,37 +95,85 @@
    int                 rv = 0;  
    int                 sockfd = 0;  
    struct sockaddr_in  servaddr;
    char                service[20];
    struct addrinfo     hints, *rp;
    struct addrinfo    *res = NULL;
    struct in_addr      inaddr;
    struct sockaddr_in  addr;
    int                 len = sizeof(addr);
    if( !sock )
        return -1;
    socket_term(sock);
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    /*+--------------------------------------------------+
     *| use getaddrinfo() to do domain name translation  |
     *+--------------------------------------------------+*/
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_INET; /* Only support IPv4 */
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP; /* TCP protocol */
    /* If $host is a valid IP address, then don't use name resolution */
    if( inet_aton(sock->host, &inaddr) )
    {
        //log_info("%s is a valid IP address, don't use domain name resolution.\n", sock->host);
        hints.ai_flags |= AI_NUMERICHOST;
    }
    /* Obtain address(es) matching host/port */
    snprintf(service, sizeof(service), "%d", sock->port);
    if( (rv=getaddrinfo(sock->host, service, &hints, &res)) )
    {
        log_error("getaddrinfo() parser [%s:%s] failed: %s\n", sock->host, service, gai_strerror(rv));
        return -3;
    }
    /* getaddrinfo() returns a list of address structures. Try each
       address until we successfully connect or bind */
    for (rp=res; rp!=NULL; rp=rp->ai_next)
    {
#if 0
        char                  ipaddr[INET_ADDRSTRLEN];
        struct sockaddr_in   *sp = (struct sockaddr_in *) rp->ai_addr;
        /* print domain name translation result */
        memset( ipaddr, 0, sizeof(ipaddr) );
        if( inet_ntop(AF_INET, &sp->sin_addr, ipaddr, sizeof(ipaddr)) )
        {
            log_info("domain name resolution [%s->%s]\n", sock->host, ipaddr);
        }
#endif
        /*  Create the socket */
        sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
    if(sockfd < 0)
    {   
        log_error("create socket failure: %s\n", strerror(errno));
        return -1;
            log_error("socket() create failed: %s\n", strerror(errno));
            rv = -3;
            continue;
    }   
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port = htons(sock->port);
    inet_aton(sock->host, &servaddr.sin_addr);
    rv=connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    if(rv < 0)
        /* connect to server */
        rv = connect(sockfd, rp->ai_addr, len);
        if( 0 == rv )
    {   
        //log_error("connect to server[%s:%d] failure: %s\n", sock->host, sock->port, strerror(errno));
            sock->fd = sockfd;
            log_info("Connect to server[%s:%d] on fd[%d] successfully!\n", sock->host, sock->port, sockfd);
            break;
        }
        else
        {
            /* socket connect get error, try another IP address */
        close(sockfd);
        return -2;
            continue;
        }
    }   
    log_info("Connect to server[%s:%d] on fd[%d] successfully!\n", sock->host, sock->port, sockfd);
    sock->fd = sockfd;
    return 0;
    freeaddrinfo(res);
    return rv;
}
/*  description: send data from the socket