一个用eXosip实现的UAC和UAS的例子(调试成功)

    经过一段时间的学习,对sip总算有了一点认识,在学习过程中,遇到了太多的问题,郁闷过,惆怅过,但是一咬牙,还是过来了。令我感动的是,在网上遇到一些很热心的朋友,不厌其烦地给我以解惑,感谢他们,尤其是友善的大狗,呵呵,希望将来有一天他能看到这篇文章。
     我是利用eXosip协议栈进行开发的,网上有一篇<一个简单的sip呼叫例子>,写的不错,但是好像有一些问题,而对于初学者来说,能拿到一个好的例子,对sip的理解可以到达事半功倍的效果。于是便把自己的写的例子拿出来,让大家参考一下,若有问题,欢迎指正。
      只需把里面的IP地址改正、编译即可使用。
   
/******************************************
编译方法:
    gcc xxx.c -o xxx -leXosip2
****************************************/
/*******************UAS*****************************************************
本文可以任意转载,但必须保留出处
作者:rainfish
网址:http://blog.csdn.net/bat603/
测试环境:eXosip3.0.1/redhat AS 4
***************************************************************************/
#include <eXosip2/eXosip.h>
#include <osip2/osip_mt.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>

int
main (int argc, char *argv[])
{
  eXosip_event_t *je = NULL;
  osip_message_t *ack = NULL;
  osip_message_t *invite = NULL;
  osip_message_t *answer = NULL;
  sdp_message_t *remote_sdp = NULL;

  int call_id, dialog_id;
  int i,j;
  int id;
  char *sour_call = "sip:[email protected]";
  char *dest_call = "sip:[email protected]:5060";

  char command;
  char tmp[4096];
  char localip[128];

  int pos = 0;

  //初始化sip
  i = eXosip_init ();
  if (i != 0)
    {
      printf ("Can't initialize eXosip!/n");
      return -1;
    }
  else
    {
      printf ("eXosip_init successfully!/n");
    }

  i = eXosip_listen_addr (IPPROTO_UDP, NULL, 5060, AF_INET, 0);
  if (i != 0)
    {
      eXosip_quit ();
      fprintf (stderr, "eXosip_listen_addr error!/nCouldn't initialize transport layer!/n");
    }

  for(;;)
    {
      //侦听是否有消息到来
      je = eXosip_event_wait (0,50);

      //协议栈带有此语句,具体作用未知
      eXosip_lock ();
      eXosip_default_action (je);
      eXosip_automatic_refresh ();
      eXosip_unlock ();

      if (je == NULL)//没有接收到消息
    continue;
      // printf ("the cid is %s, did is %s/n", je->did, je->cid);
      switch (je->type)
    {
    case EXOSIP_MESSAGE_NEW://新的消息到来
      printf (" EXOSIP_MESSAGE_NEW!/n");
      if (MSG_IS_MESSAGE (je->request))//如果接受到的消息类型是MESSAGE
        {
      {
      
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
获取本地发送invite的tid和did需要先在程序中创建一个SIP会话,然后使用exosip_call_send_invite函数发送invite请求。在函数返回成功后,可以通过exosip_call_get_tid和exosip_call_get_did函数获取本地发送invite的tid和did。 下面是一个简单的C程序示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <eXosip2/eXosip.h> int main(int argc, char *argv[]) { int ret = 0; osip_message_t *invite = NULL; const char *to = "sip:alice@example.com"; const char *from = "sip:bob@example.com"; const char *body = "Hello Alice!"; eXosip_t *ctx = NULL; int tid = 0, did = 0; /* 初始化exosip协议栈 */ ret = eXosip_init(); if (ret != 0) { printf("eXosip_init failed: %d\n", ret); return -1; } /* 注册SIP账号 */ ret = eXosip_register_build_initial_request(ctx, from, from, NULL, 60, &invite); if (ret != 0) { printf("eXosip_register_build_initial_request failed: %d\n", ret); goto exit; } ret = eXosip_register_send_request(invite); if (ret != 0) { printf("eXosip_register_send_request failed: %d\n", ret); goto exit; } /* 创建SIP会话并发送invite请求 */ ret = eXosip_call_build_initial_invite(ctx, to, from, NULL, &tid); if (ret != 0) { printf("eXosip_call_build_initial_invite failed: %d\n", ret); goto exit; } ret = eXosip_call_send_invite(tid, body); if (ret != 0) { printf("eXosip_call_send_invite failed: %d\n", ret); goto exit; } /* 获取本地发送invite的tid和did */ did = eXosip_call_get_did(tid); printf("Local DID: %d\n", did); tid = eXosip_call_get_tid(did); printf("Local TID: %d\n", tid); exit: /* 清理exosip协议栈 */ eXosip_quit(); return 0; } ``` 注意:该程序仅供参考,实际使用时需要根据具体情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值