eXosip简例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

eXosip简例
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,\ sprintf(registerer,\
//初始化 if( flag == 0) {
i = eXosip_init(); if (i != 0) {
return -1; }
TRACE(\ flag ++;
i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5060, AF_INET, 0); if (i != 0) {
eXosip_quit();
fprintf(stderr, \ return -1; }
TRACE(\ }
osip_message_t *reg = NULL;
eXosip_lock();
id = eXosip_register_build_initial_register (identity,registerer, NULL, 1800, &reg); printf(\
if (id < 0) {
eXosip_unlock();
fprintf (stderr, \ return 0; }
eXosip_lock();
i = eXosip_register_send_register(id, reg); if (i != 0) {
fprintf (stderr, \ return 0; } eXosip_unlock ();
TRACE(\
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(\ 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(\ 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) ? \ 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) ? \ 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) ? \ 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, \ snprintf
(eXosip.ipv6_for_gateway, 256, \
\#ifndef MINISIZE
snprintf (eXosip.event_package, 256, \#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,
\ } } #endif
er_agent = osip_strdup (\ if (er_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 (er_agent); er_agent = NULL; return OSIP_NOMEM; } #endif
eXosip.j_mutexlock = (struct osip_mutex *) osip_mutex_init (); if (eXosip.j_mutexlock == NULL)
感谢您的阅读,祝您生活愉快。

相关文档
最新文档