Changeset 4218 for pjproject/trunk/pjlib/src/pj/sock_common.c
- Timestamp:
- Aug 7, 2012 2:18:15 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib/src/pj/sock_common.c
r3841 r4218 957 957 } 958 958 959 /* Get the default IP interface */ 960 PJ_DEF(pj_status_t) pj_getdefaultipinterface(int af, pj_sockaddr *addr) 961 { 959 /* Get IP interface for sending to the specified destination */ 960 PJ_DEF(pj_status_t) pj_getipinterface(int af, 961 const pj_str_t *dst, 962 pj_sockaddr *itf_addr, 963 pj_bool_t allow_resolve, 964 pj_sockaddr *p_dst_addr) 965 { 966 pj_sockaddr dst_addr; 962 967 pj_sock_t fd; 963 pj_str_t cp;964 pj_sockaddr a;965 968 int len; 966 969 pj_uint8_t zero[64]; 967 970 pj_status_t status; 968 971 969 addr->addr.sa_family = (pj_uint16_t)af; 970 972 pj_sockaddr_init(af, &dst_addr, NULL, 53); 973 status = pj_inet_pton(af, dst, pj_sockaddr_get_addr(&dst_addr)); 974 if (status != PJ_SUCCESS) { 975 /* "dst" is not an IP address. */ 976 if (allow_resolve) { 977 status = pj_sockaddr_init(af, &dst_addr, dst, 53); 978 } else { 979 pj_str_t cp; 980 981 if (af == PJ_AF_INET) { 982 cp = pj_str("1.1.1.1"); 983 } else { 984 cp = pj_str("1::1"); 985 } 986 status = pj_sockaddr_init(af, &dst_addr, &cp, 53); 987 } 988 989 if (status != PJ_SUCCESS) 990 return status; 991 } 992 993 /* Create UDP socket and connect() to the destination IP */ 971 994 status = pj_sock_socket(af, pj_SOCK_DGRAM(), 0, &fd); 972 995 if (status != PJ_SUCCESS) { 973 996 return status; 974 997 } 998 999 status = pj_sock_connect(fd, &dst_addr, pj_sockaddr_get_len(&dst_addr)); 1000 if (status != PJ_SUCCESS) { 1001 pj_sock_close(fd); 1002 return status; 1003 } 1004 1005 len = sizeof(*itf_addr); 1006 status = pj_sock_getsockname(fd, itf_addr, &len); 1007 if (status != PJ_SUCCESS) { 1008 pj_sock_close(fd); 1009 return status; 1010 } 1011 1012 pj_sock_close(fd); 1013 1014 /* Check that the address returned is not zero */ 1015 pj_bzero(zero, sizeof(zero)); 1016 if (pj_memcmp(pj_sockaddr_get_addr(itf_addr), zero, 1017 pj_sockaddr_get_addr_len(itf_addr))==0) 1018 { 1019 return PJ_ENOTFOUND; 1020 } 1021 1022 if (p_dst_addr) 1023 *p_dst_addr = dst_addr; 1024 1025 return PJ_SUCCESS; 1026 } 1027 1028 /* Get the default IP interface */ 1029 PJ_DEF(pj_status_t) pj_getdefaultipinterface(int af, pj_sockaddr *addr) 1030 { 1031 pj_str_t cp; 975 1032 976 1033 if (af == PJ_AF_INET) { … … 979 1036 cp = pj_str("1::1"); 980 1037 } 981 status = pj_sockaddr_init(af, &a, &cp, 53); 982 if (status != PJ_SUCCESS) { 983 pj_sock_close(fd); 984 return status; 985 } 986 987 status = pj_sock_connect(fd, &a, pj_sockaddr_get_len(&a)); 988 if (status != PJ_SUCCESS) { 989 pj_sock_close(fd); 990 return status; 991 } 992 993 len = sizeof(a); 994 status = pj_sock_getsockname(fd, &a, &len); 995 if (status != PJ_SUCCESS) { 996 pj_sock_close(fd); 997 return status; 998 } 999 1000 pj_sock_close(fd); 1001 1002 /* Check that the address returned is not zero */ 1003 pj_bzero(zero, sizeof(zero)); 1004 if (pj_memcmp(pj_sockaddr_get_addr(&a), zero, 1005 pj_sockaddr_get_addr_len(&a))==0) 1006 { 1007 return PJ_ENOTFOUND; 1008 } 1009 1010 pj_sockaddr_copy_addr(addr, &a); 1011 1012 /* Success */ 1013 return PJ_SUCCESS; 1038 1039 return pj_getipinterface(af, &cp, addr, PJ_FALSE, NULL); 1014 1040 } 1015 1041
Note: See TracChangeset
for help on using the changeset viewer.