Changeset 721 for pjproject/trunk


Ignore:
Timestamp:
Sep 14, 2006 6:51:01 PM (18 years ago)
Author:
bennylp
Message:

Fix the local IP address resolution issue in PJSIP, PJMEDIA, and PJSUA, by adding a new API pj_gethostip() to resolve the default local IP address of local host. This new function will work even when local hostname resolution is not set correctly, by detecting the default IP interface in the system.

Also fix compile warnings in iLBC.

Location:
pjproject/trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/include/pj/addr_resolv.h

    r65 r721  
    2222/** 
    2323 * @file addr_resolv.h 
    24  * @brief Address resolve (pj_gethostbyname()). 
     24 * @brief IP address resolution. 
    2525 */ 
    2626 
    27 #include <pj/types.h> 
     27#include <pj/sock.h> 
    2828 
    2929PJ_BEGIN_DECL 
     
    8585 
    8686 
     87/** 
     88 * Resolve the primary IP address of local host.  
     89 * 
     90 * @param ip_addr   On successful resolution, this will be filled up with 
     91 *                  the host IP address, in network byte order. 
     92 * 
     93 * @return          PJ_SUCCESS on success, or the appropriate error code. 
     94 */ 
     95PJ_DECL(pj_status_t) pj_gethostip(pj_in_addr *ip_addr); 
     96 
     97 
    8798/** @} */ 
    8899 
  • pjproject/trunk/pjlib/src/pj/addr_resolv_sock.c

    r65 r721  
    2020#include <pj/assert.h> 
    2121#include <pj/string.h> 
     22#include <pj/errno.h> 
    2223#include <pj/compat/socket.h> 
    23 #include <pj/errno.h> 
    2424 
    2525 
     
    5050} 
    5151 
     52/* Resolve the IP address of local machine */ 
     53pj_status_t pj_gethostip(pj_in_addr *addr) 
     54{ 
     55    const pj_str_t *hostname = pj_gethostname(); 
     56    struct pj_hostent he; 
     57    pj_str_t cp; 
     58    pj_in_addr loopip; 
     59    pj_status_t status; 
     60 
     61    cp = pj_str("127.0.0.1"); 
     62    loopip = pj_inet_addr(&cp); 
     63 
     64    /* Try with resolving local hostname first */ 
     65    status = pj_gethostbyname(hostname, &he); 
     66    if (status == PJ_SUCCESS) { 
     67        *addr = *(pj_in_addr*)he.h_addr; 
     68    } 
     69 
     70 
     71    /* If we end up with 127.0.0.1, resolve the IP by getting the default 
     72     * interface to connect to some public host. 
     73     */ 
     74    if (status != PJ_SUCCESS || addr->s_addr == loopip.s_addr) { 
     75        pj_sock_t fd; 
     76        pj_sockaddr_in a; 
     77        int len; 
     78 
     79        status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &fd); 
     80        if (status != PJ_SUCCESS) { 
     81            return status; 
     82        } 
     83 
     84        cp = pj_str("1.1.1.1"); 
     85        pj_sockaddr_in_init(&a, &cp, 53); 
     86 
     87        status = pj_sock_connect(fd, &a, sizeof(a)); 
     88        if (status != PJ_SUCCESS) { 
     89            pj_sock_close(fd); 
     90            return status; 
     91        } 
     92 
     93        len = sizeof(a); 
     94        status = pj_sock_getsockname(fd, &a, &len); 
     95        if (status != PJ_SUCCESS) { 
     96            pj_sock_close(fd); 
     97            return status; 
     98        } 
     99 
     100        pj_sock_close(fd); 
     101 
     102        *addr = a.sin_addr; 
     103    } 
     104 
     105    return status; 
     106} 
     107 
     108 
  • pjproject/trunk/pjmedia/src/pjmedia-codec/ilbc/iCBSearch.c

    r638 r721  
    128128               pp=buf+LPC_FILTERORDER+lMem-lTarget; 
    129129               for (j=0; j<lTarget; j++) { 
    130                    *ppe+=(*pp)*(*pp++); 
     130                   *ppe+=(*pp)*(*pp); 
     131                   ++pp; 
    131132               } 
    132133 
     
    323324               pp=cbvectors+lMem-lTarget; 
    324325               for (j=0; j<lTarget; j++) { 
    325                    *ppe+=(*pp)*(*pp++); 
     326                   *ppe+=(*pp)*(*pp); 
     327                   ++pp; 
    326328               } 
    327329 
  • pjproject/trunk/pjmedia/src/pjmedia/transport_udp.c

    r705 r721  
    246246    /* If address is 0.0.0.0, use host's IP address */ 
    247247    if (tp->rtp_addr_name.sin_addr.s_addr == 0) { 
    248         pj_hostent he; 
    249         const pj_str_t *hostname = pj_gethostname(); 
    250         status = pj_gethostbyname(hostname, &he); 
    251         if (status != PJ_SUCCESS) { 
     248        pj_in_addr hostip; 
     249 
     250        status = pj_gethostip(&hostip); 
     251        if (status != PJ_SUCCESS) 
    252252            goto on_error; 
    253         } 
    254         tp->rtp_addr_name.sin_addr = *(pj_in_addr*)he.h_addr; 
     253 
     254        tp->rtp_addr_name.sin_addr = hostip; 
    255255    } 
    256256 
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r715 r721  
    7979static pj_str_t         uri_arg; 
    8080 
     81#ifdef STEREO_DEMO 
    8182static void stereo_demo(); 
     83#endif 
    8284 
    8385/***************************************************************************** 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_tcp.c

    r635 r721  
    250250     */ 
    251251    if (listener_addr->sin_addr.s_addr == 0) { 
    252         const pj_str_t *hostname; 
    253         struct pj_hostent he; 
    254  
    255         hostname = pj_gethostname(); 
    256         status = pj_gethostbyname(hostname, &he); 
     252        pj_in_addr hostip; 
     253 
     254        status = pj_gethostip(&hostip); 
    257255        if (status != PJ_SUCCESS) 
    258256            goto on_error; 
    259257 
    260         listener_addr->sin_addr = *(pj_in_addr*)he.h_addr; 
     258        listener_addr->sin_addr = hostip; 
    261259    } 
    262260 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_udp.c

    r635 r721  
    653653         */ 
    654654        if (tmp_addr.sin_addr.s_addr == PJ_INADDR_ANY) { 
    655             pj_hostent he; 
    656             const pj_str_t *hostname = pj_gethostname(); 
    657             status = pj_gethostbyname(hostname, &he); 
    658             if (status != PJ_SUCCESS) { 
    659                 pj_sock_close(sock); 
     655            pj_in_addr hostip; 
     656 
     657            status = pj_gethostip(&hostip); 
     658            if (status != PJ_SUCCESS) 
    660659                return status; 
    661             } 
    662             pj_strcpy2(&bound_name.host,  
    663                        pj_inet_ntoa(*(pj_in_addr*)he.h_addr)); 
     660 
     661            pj_strcpy2(&bound_name.host, pj_inet_ntoa(hostip)); 
    664662        } else { 
    665663            /* Otherwise use bound address. */ 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r690 r721  
    813813    } else { 
    814814 
    815         const pj_str_t *hostname = pj_gethostname(); 
    816         struct pj_hostent he; 
    817  
    818         status = pj_gethostbyname(hostname, &he); 
     815        pj_bzero(p_pub_addr, sizeof(pj_sockaddr_in)); 
     816 
     817        status = pj_gethostip(&p_pub_addr->sin_addr); 
    819818        if (status != PJ_SUCCESS) { 
    820             pjsua_perror(THIS_FILE, "Unable to resolve local host", status); 
    821819            pj_sock_close(sock); 
    822820            return status; 
    823821        } 
    824822 
    825         pj_bzero(p_pub_addr, sizeof(pj_sockaddr_in)); 
    826823        p_pub_addr->sin_family = PJ_AF_INET; 
    827824        p_pub_addr->sin_port = pj_htons((pj_uint16_t)port); 
    828         p_pub_addr->sin_addr = *(pj_in_addr*)he.h_addr; 
    829825    } 
    830826 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r659 r721  
    287287 
    288288        } else { 
    289             const pj_str_t *hostname; 
    290             pj_sockaddr_in addr; 
     289            pj_in_addr addr; 
    291290 
    292291            /* Get local IP address. */ 
    293             hostname = pj_gethostname(); 
    294  
    295             pj_bzero( &addr, sizeof(addr)); 
    296             addr.sin_family = PJ_AF_INET; 
    297             status = pj_sockaddr_in_set_str_addr( &addr, hostname); 
    298             if (status != PJ_SUCCESS) { 
    299                 pjsua_perror(THIS_FILE, "Unresolvable local hostname",  
    300                              status); 
     292            status = pj_gethostip(&addr); 
     293            if (status != PJ_SUCCESS) 
    301294                goto on_error; 
    302             } 
    303295 
    304296            for (i=0; i<2; ++i) 
    305                 pj_memcpy(&mapped_addr[i], &addr, sizeof(addr)); 
     297                mapped_addr[i].sin_addr = addr; 
    306298 
    307299            mapped_addr[0].sin_port=pj_htons((pj_uint16_t)rtp_port); 
Note: See TracChangeset for help on using the changeset viewer.