virtual void TearDown() { delete nad; delete nhid; delete nsid; if (ai) Xfreeaddrinfo(ai); }
static belle_sip_socket_t create_udp_socket(const char *addr, int port, int *family){ /* struct addrinfo hints={0}; */ struct addrinfo *res=NULL; int err; belle_sip_socket_t sock; char portnum[10]; /* int optval=1; */ snprintf(portnum,sizeof(portnum),"%i",port); /* hints.ai_family=AF_UNSPEC; hints.ai_socktype=SOCK_DGRAM; hints.ai_protocol=IPPROTO_UDP; hints.ai_flags=AI_NUMERICSERV; */ err=Xgetaddrinfo(addr,NULL,NULL,&res); if (err!=0){ printf("getaddrinfo() failed for %s port %i: %s",addr,port,gai_strerror(err)); return -1; } *family=res->ai_family; /* sock=Xsocket(res->ai_family,res->ai_socktype,res->ai_protocol); */ sock=Xsocket(AF_XIA, SOCK_DGRAM, 0); if (sock==-1){ printf("Cannot create UDP socket: %s",belle_sip_get_socket_error_string()); Xfreeaddrinfo(res); return -1; } /* err = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof (optval)); if (err == -1){ belle_sip_warning ("Fail to set SIP/UDP address reusable: %s.", belle_sip_get_socket_error_string()); } */ err=Xbind(sock,res->ai_addr,res->ai_addrlen); if (err==-1){ printf("udp bind() failed for %s port %i: %s",addr,port,belle_sip_get_socket_error_string()); close_socket(sock); Xfreeaddrinfo(res); return -1; } Xfreeaddrinfo(res); return sock; }
int linphone_core_get_local_ip_for(int type, const char *dest, char *result){ struct addrinfo hints={0}; struct addrinfo *res=NULL; socklen_t s; int err; hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_XIA; err=Xgetaddrinfo(NULL, NULL, &hints, &res); if (err!=0){ ms_error("getaddrinfo() error: %s",gai_strerror(err)); return -1; } s=sizeof(sockaddr_x); err=Xgetnameinfo(res->ai_addr,s,result,LINPHONE_IPADDR_SIZE,NULL,0,NI_NUMERICHOST); // printf("getnameinfo: %s\n", result); Xfreeaddrinfo(res); return 0; }
int parse_hostname_to_addr(const char *server, sockaddr_x *ss, socklen_t *socklen){ /* struct addrinfo hints,*res=NULL; int family = PF_INET; int port_int = 3478; int ret; char port[6]; char host[NI_MAXHOST]; char *p1, *p2; if ((sscanf(server, "[%64[^]]]:%d", host, &port_int) == 2) || (sscanf(server, "[%64[^]]]", host) == 1)) { family = PF_INET6; } else { p1 = strchr(server, ':'); p2 = strrchr(server, ':'); if (p1 && p2 && (p1 != p2)) { family = PF_INET6; host[NI_MAXHOST-1]='\0'; strncpy(host, server, sizeof(host) - 1); } else if (sscanf(server, "%[^:]:%d", host, &port_int) != 2) { host[NI_MAXHOST-1]='\0'; strncpy(host, server, sizeof(host) - 1); } } snprintf(port, sizeof(port), "%d", port_int); memset(&hints,0,sizeof(hints)); hints.ai_family=family; hints.ai_socktype=SOCK_DGRAM; hints.ai_protocol=IPPROTO_UDP; */ int ret; struct addrinfo *res=NULL; ret=Xgetaddrinfo(server,NULL,NULL,&res); if (ret!=0){ /* ms_error("getaddrinfo() failed for %s:%s : %s",host,port,gai_strerror(ret)); */ return -1; } if (!res) return -1; memcpy(ss,res->ai_addr,res->ai_addrlen); *socklen=res->ai_addrlen; Xfreeaddrinfo(res); return 0; }