网络电话注册
#include
#include
#include
#include
#include
#include
#include
int myregister()
{
int i;
#if 0
i = eXosip_init();
if (i != 0)
{
return -1;
}
printf("eXosip_init success\n");
i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5060, AF_INET, 0);
if (i != 0)
{
eXosip_quit();
fprintf(stderr, "could not initialize transport layer\n");
return -1;
}
printf("eXosip_listen_addr success\n"); #endif
int flag=0;
int id;
osip_message_t *reg = NULL;
eXosip_lock();
id = eXosip_register_build_initial_register
("sip:77001234@192.168.8.24", "sip:61.233.3.35:5060", NULL,
1800, ?);
printf("id = %d", id);
if (id < 0)
{
eXosip_unlock();
fprintf (stderr, "eXosip_register_build_initial_register
failed:(bad arguments?)\n");
exit(-1);
}
i = eXosip_register_send_register(id, reg);
if (i != 0)
{
fprintf (stderr, "eXosip_register_send_register failed: (bad
arguments?)\n");
return -1;
}
eXosip_unlock ();
printf("eXosip_register_send_register OK\n");
eXosip_event_t *je;
for (;;)
{
je = eXosip_event_wait (0, 50);
eXosip_lock();
eXosip_automatic_action ();
eXosip_unlock();
if (je == NULL)
{
continue;
}
if (je->type == EXOSIP_REGISTRATION_SUCCESS)
{
printf("textinfo is %s\n", je->textinfo);
break;
}
if(je->type == EXOSIP_REGISTRATION_FAILURE)
{
eXosip_add_authentication_info("77001234", "77001234","654987", NULL, NULL);
}
if(je->type == EXOSIP_REGISTRATION_REFRESHED)
{
printf("refreshed");
return 1;
}
}
// eXosip_quit();
sleep(1);
}
1. ?ÓÀûÓÃeXosipµÄ×??á?ªÊ?
int i;
char identity[50];
char registerer[50];
char localip[128];
static int flag = 0;
int id;
eXosip_guess_localip (AF_INET, localip, 128);
sprintf(identity,"sip:%s@%s",username,localip);
sprintf(registerer,"sip:%s:%s",ip_url,port);
//?õÊ???
if( flag == 0)
{
i = eXosip_init();
if (i != 0)
{
return -1;
}
TRACE("eXosip_init success/n");
flag ++;
i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5060, AF_INET, 0);
if (i != 0)
{
eXosip_quit();
fprintf(stderr, "could not initialize transport layer/n");
return -1;
}
TRACE("eXosip_listen_addr success/n");
}
osip_message_t *reg = NULL;
eXosip_lock();
id = eXosip_register_build_initial_register (identity,registerer,
NULL, 1800, ®);
printf("id = %d", id);
if (id < 0)
{
eXosip_unlock();
fprintf (stderr, "eXosip_register_build_initial_register
failed:(bad arguments?)/n");
return 0;
}
eXosip_lock();
i = eXosip_register_send_register(id, reg);
if (i != 0)
{
fprintf (stderr, "eXosip_register_send_register failed: (bad
arguments?)/n");
return 0; }
eXosip_unlock ();
TRACE("eXosip_register_send_register OK/n");
eXosip_event_t *je;
for (;;)
{
je = eXosip_event_wait (0, 50);
eXosip_lock();
eXosip_automatic_action ();
eXosip_unlock();
if (je == NULL)
{
continue;
}
if (je->type == EXOSIP_REGISTRATION_SUCCESS)
{
TRACE("textinfo is %s/n", je->textinfo);
return 1;
break;
}
if(je->type == EXOSIP_REGISTRATION_FAILURE)
{
//×??áÊ??ÜÖ?ºó??ÔÙ?ÎÌá??ÊÚÈ?ÐÅÏ??? Ò??É?ÅÔÚÉÏÃæ
eXosip_add_authentication_info(username, username,password, NULL, NULL);
}
if(je->type == EXOSIP_REGISTRATION_REFRESHED)
{
TRACE("refreshed");
return 0;
}
}
eXosip_quit();
eXosip_guess_localip (AF_INET, localip, 128);
Õâ?äÔÚeXosipÖеÄʵÏÖΪ
eXosip_guess_localip (int family, char *address, int size)
addressÔÚº?ÊýÌåÍâÊ×ÏÈ?øÐÐ??ÒåΪÒ?Êý×é???ÖÅäºÃ?Õ?ä??ÔÙ?øÐÎÊ??ÎÊý??Ö?Õë?ýÈ???ÔÚº?ÊýÌåÄÚ?Ôʵ?Ê?ÎÊýaddress??Öµ??ÕâÀï?ÍÊÇ??µØµÄipµØÖ???
?Î?ûeXosip_guess_localip µÄʵÏÖ
int
eXosip_guess_ip_for_via (int family, char *address, int size) {
SOCKET sock;
SOCKADDR_STORAGE local_addr;
int local_addr_len;
struct addrinfo *addrf;
address[0] = '\0';
sock = socket (family, SOCK_DGRAM, 0);
if (family == AF_INET)
{
getaddrinfo (eXosip.ipv4_for_gateway, NULL, NULL, &addrf);
} else if (family == AF_INET6)
{
getaddrinfo (eXosip.ipv6_for_gateway, NULL, NULL, &addrf);
}
if (addrf == NULL)
{
closesocket (sock);
snprintf (address, size, (family == AF_INET) ? "127.0.0.1" : "::1");
return OSIP_NO_NETWORK;
}
if (WSAIoctl
(sock, SIO_ROUTING_INTERFACE_QUERY, addrf->ai_addr, addrf->ai_addrlen,
&local_addr, sizeof (local_addr), &local_addr_len, NULL, NULL) != 0)
{
closesocket (sock);
freeaddrinfo (addrf);
snprintf (address, size, (family == AF_INET) ? "127.0.0.1" : "::1");
return OSIP_NO_NETWORK;
}
closesocket (sock);
freeaddrinfo (addrf);
if (getnameinfo ((const struct sockaddr *) &local_addr,
local_addr_len, address, size, NULL, 0, NI_NUMERICHOST))
{
snprintf (address, size, (family == AF_INET) ? "127.0.0.1" : "::1");
return OSIP_NO_NETWORK;
}
return OSIP_SUCCESS;
}
Í??ýdebugÑéÖ?ºÍ?áºÏeXosipµÄcode??ÕâÀïµÃµ?µÄµØÖ?Ϊ???صØÖ?127.0.0.1.??ÖªµÀµÃµ?Õâ?öµØÖ?ÓÐÊ?Ã?ÓÃ??
ÏÂÒ???ÊÇeXosip_init()
eXosip_init()µÄÔ?codeÈçÏÂ?º
eXosip_init (void)
{
osip_t *osip;
int i;
memset (&eXosip, 0, sizeof (eXosip));
snprintf (eXosip.ipv4_for_gateway, 256, "%s", "217.12.3.11");
snprintf (eXosip.ipv6_for_gateway, 256, "%s",
"2001:638:500:101:2e0:81ff:fe24:37c6"); #ifndef MINISIZE
snprintf (eXosip.event_package, 256, "%s", "dialog"); #endif
#ifdef WIN32
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD (1, 1);
i = WSAStartup (wVersionRequested, &wsaData);
if (i != 0)
{
OSIP_TRACE (osip_trace
(__FILE__, __LINE__, OSIP_WARNING, NULL,
"eXosip: Unable to initialize WINSOCK, reason: %d\n",
i));
}
}
#endif
eXosip.user_agent = osip_strdup ("eXosip/" EXOSIP_VERSION);
if (eXosip.user_agent == NULL)
return OSIP_NOMEM;
eXosip.j_calls = NULL;
eXosip.j_stop_ua = 0;
#ifdef OSIP_MT
eXosip.j_thread = NULL;
#endif
i = osip_list_init (&eXosip.j_transactions);
eXosip.j_reg = NULL;
#ifdef OSIP_MT
#if !defined (_WIN32_WCE)
eXosip.j_cond = (struct osip_cond *) osip_cond_init ();
if (eXosip.j_cond == NULL)
{
osip_free (eXosip.user_agent);
eXosip.user_agent = NULL;
return OSIP_NOMEM;
}
#endif
eXosip.j_mutexlock = (struct osip_mutex *) osip_mutex_init ();
if (eXosip.j_mutexlock == NULL)
{
osip_free (eXosip.user_agent);
eXosip.user_agent = NULL;
#if !defined (_WIN32_WCE)
osip_cond_destroy ((struct osip_cond *) eXosip.j_cond);
eXosip.j_cond = NULL;
#endif
return OSIP_NOMEM;
}
#endif
i = osip_init (&osip);
if (i != 0)
{
OSIP_TRACE (osip_trace
(__FILE__, __LINE__, OSIP_ERROR, NULL,
"eXosip: Cannot initialize osip!\n"));
return i;
}
osip_set_application_context (osip, &eXosip);
eXosip_set_callbacks (osip);
eXosip.j_osip = osip;
#ifdef OSIP_MT
eXosip.j_socketctl = jpipe ();
if (eXosip.j_socketctl == NULL)
return OSIP_UNDEFINED_ERROR;
eXosip.j_socketctl_event = jpipe ();
if (eXosip.j_socketctl_event == NULL)
return OSIP_UNDEFINED_ERROR;
#endif
eXosip.j_events = (osip_fifo_t *) osip_malloc (sizeof (osip_fifo_t));
if (eXosip.j_events == NULL)
return OSIP_NOMEM;
osip_fifo_init (eXosip.j_events);
eXosip.use_rport = 1;
eXosip.use_naptr = 1;
eXosip.keep_alive = 17000;
eXtl_udp.tl_init ();
eXtl_tcp.tl_init ();
#ifdef HAVE_OPENSSL_SSL_H
#if !(OPENSSL_VERSION_NUMBER < 0x00908000L)
eXtl_dtls.tl_init ();
#endif
eXtl_tls.tl_init ();
#endif
return OSIP_SUCCESS;
}
??ÉÏÈ??úÂëºÜ?à??ÆäʵÖ?ÒªÊÇÅÐ?ϵĺêÌ??àÁË??Ò?????µÄÀíÇå??
eXosip ΪÈ??Ö?äÁ???ÀïÃæ??ÒåÁËÒ??ó?Ñ?äÁ???
?Ó×Å?õÊ???eXosipµÄÁ??ö?ÉÔ??äÁ???µ?ÊÇ??ÖªµÀÕâÁ??ö?õÊ???µÄÖµÊÇ?ÓÄÄÀï
À?µÄ
?ÓÏÂÀ???win32µÄ???Ö??ÊÇÓÃWSAStartup?ÔwindowsµÄÍøÂç???Ö?øÐÐ?õÊ?????
ΪÁËÔÚÓ?ÓÃ?ÌÐòµ?Öе?ÓÃÈκÎÒ??öWinsock
APIº?Êý??Ê×ÏȵÚÒ??þÊÂÇé?ÍÊÇ?ØÐëÍ??ýWSAStartupº?ÊýÍê?É?ÔWinsock?þÎñ
µÄ?õÊ?????Òò?ËÐèÒªµ?ÓÃWSAStartupº?Êý??Ê?ÓÃSocketµÄ?ÌÐòÔÚÊ?ÓÃSocketÖ?Ç??ØÐëµ?ÓÃWSAStartupº?Êý??
?ÓÏÂÀ??ÔeXosip?á??µÄuser_agent?øÐÐ?õÊ??????Ñ?ÎÊýµÄ×Ö?û????ÖÆ?øuser_agent??ÀïÃæµÄʵÏÖʵ?Ê?ÍÊÇ?ÖÅäÄÚ?æ??È?ºó?øÐÐstr????µÄ?Ù×???
eXosip.j_stop_ua =
0;Õâ?ö?äÁ??È?ÏÖØÒª??Í??ýÕâ?öÖµÅÐ?ÏÐ,ÒéÕ?ÊÇ?ñÒªÒ?Ö?ÔËÐÐ
i = osip_list_init (&eXosip.j_transactions);
?õÊ?????ÓÃmemsetÉèÖÃΪ0
?,?,
ÔÚ?õÊ???ÍêeXosip?á??µÄÒ?Ð??äÁ?ºó???õÊ???osip?á??
i = osip_init (&osip);
osip_set_application_context (osip, &eXosip);
ÒÔÉÏÕâ?äºÜÓÐÒâË???ÔÚºÜ?àÇé?öÏÂ??ÎÒÃÇ?ÉÒÔÑ?Ï?Õâ?ö×ö??????eXosipµÄ?á??ÉèÖõ?osipÖÐ?øÐÐ???æ??È?ºóÒ??ß?áÓÐÒ??öosip_get_application????À?È??öÕâ?öeXosip?á????Ò??ÍÊÇ˵?ÉÒÔÔÚosipµÄ????ÖÐÈ??öexosip??µ?ÓÃexosipµÄ??Î???
eXosip_set_callbacks (osip);
ÉèÖÃosipµÄ?ص?º?Êý??ÕâÀïºÜÖØÒª??
?,?,
eXtl_udp.tl_init ();
eXtl_tcp.tl_init ();
ÕâÁ??äÊÇ?ãÉçÃ?µÄ??(?Ôudp??tcpÁ??ö??Í?µÄsocket?øÐÐÒ?Ð??õÊ???µÄ??×???ÔÚºóÃæÍ??ýÅÐ?ÏÊÇÊ?ÓÃtcp??ÊÇudp??À??ÔÓ?openÄ??ösocket)
?ÓÏÂÀ?
eXosip_listen_addr
?ù?Ýudp?òÕßtcp??openÉÏÎÄ??ÒåºÃµÄsocket??
eXosip_register_build_initial_register
????×??áÏûÏ???
eXosip_register_send_register
???ö×??áÏûÏ?