eXosip实现一个UAC,只能发送无法接受

yonglei0915 2016-07-21 10:48:49
各位好,我准备用libosip2和libeXosip2实现一个客户端(简称uac demo),首先打算做个演示程序出来,向指定的Sip Server注册,然后给同样注册到该Server的软电话A拨打电话。可是无法注册成功,我看了一下,uac demo发送出去一个Register报文后,收到一个401 Challenge报文,然后uac demo就没有回应了。程序代码如下所示:
#include <eXosip2/eXosip.h>
#include <eXosip2/eXosip2.h>
#include <pthread.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>

int32_t sip_init_reg(int32_t id);
int32_t sip_init_call(int32_t dst_id);

eXosip_t *excontext;
uint8_t proxy_ip_str[16] = "10.1.1.2";

int main(void)
{
int32_t i,mtx_ret;
uint32_t phone_number = 30020209;
uint16_t port;
pthread_t tid;

TRACE_INITIALIZE(6,stdout);
port = 12345;

excontext = (eXosip_t *) malloc(sizeof(eXosip_t));
if(NULL == excontext)
{
fprintf(stderr,"excontext malloc failed!\n");
return -1;
}

i = eXosip_init(excontext);
if(i != 0)
{
fprintf(stderr,"eXosip_init failed!\n");
return -1;
}

eXosip_set_user_agent(excontext,"uac-demo");

i = eXosip_listen_addr(excontext,IPPROTO_UDP,NULL,port,AF_INET,0);
if(i != 0)
{
eXosip_quit(excontext);
fprintf(stderr,"could not initialize transport layer\n");
return -1;
}
if(sip_init_reg(phone_number)<0)
{
fprintf(stderr,"sip init register failed!\n");
return -1;
}
getchar();//防止程序过快退出
free(excontext);
return 0;
}

int32_t sip_init_reg(int32_t id)
{
osip_message_t *reg = NULL;
int32_t i;
int32_t regid;
uint8_t userid[16];
uint8_t passwd[16];
char from[50];
char contact[50];
char proxy[50];
char ip_buf[16];
memset(userid,0,16);
memset(passwd,0,16);
memset(from,0,50);
memset(contact,0,50);
memset(proxy,0,50);
memset(ip_buf,0,16);

snprintf(userid,9,"%d",id);
snprintf(passwd,4,"%s","123");

eXosip_lock(excontext);
i = eXosip_add_authentication_info(excontext,userid,userid,passwd,"MD5",NULL);
if(i < 0)
{
fprintf(stderr,"add authentication info failed!\n");
return -1;
}

sprintf(ip_buf,"%s","10.1.1.100");
sprintf(from,"sip:%d@%s",30020209,ip_buf);
sprintf(contact,"sip:%d@%s:%d",30020209,ip_buf,12345);
sprintf(proxy,"sip:%s:%d","10.10.1.2",5060);
regid = eXosip_register_build_initial_register(excontext,from,proxy,contact,1800,®);
printf("regid = %d\n",regid);
if(regid < 0)
{
fprintf(stderr,"build initial register failed!\n");
return -1;
}
osip_message_set_supported(reg,"100rel");
osip_message_set_supported(reg,"path");
i = eXosip_register_send_register(excontext,regid, reg);
if(i < 0)
{
fprintf(stderr,"send register failed!\n");
return -1;
}
eXosip_unlock(excontext);
return 0;
}

服务器IP:10.1.1.2
服务器端口:5060

本地IP:10.1.1.100
本地端口:12345


现在的问题是服务器发给客户端一个401 Challenge以后,客户端没有接着发送Register。看起来好像客户端没有收到401报文。
补充一下:客户端运行在linux上,libeXosip2支持多线程。通过gdb工具发现eXosip_listen_addr语句执行后,程序产生了一个新的线程;
在这里问一下,我上面的代码有什么问题吗?谢谢!!!
...全文
1809 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,394

社区成员

发帖
与我相关
我的任务
社区描述
VOIP相关技术探讨专区
社区管理员
  • VOIP技术探讨社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧