第一范文网 - 专业文章范例文档资料分享平台

eXosip简例

来源:用户分享 时间:2025/11/6 4:17:47 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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, ®); 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

搜索更多关于: eXosip简例 的文档
eXosip简例.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c060w02qz5r3jk4h7snkx_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top