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

本文提供了一个使用eXosip实现的SIP用户代理客户端(UAC)和服务器(UAS)的示例,包括监听、接收和响应不同类型的SIP消息。示例中包含了如何处理INVITE、ACK、MESSAGE和INFO请求,并展示了如何构建和发送SIP响应。
摘要由CSDN通过智能技术生成
    经过一段时间的学习,对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:133@192.168.0.133";
  char *dest_call = "sip:140@192.168.0.140: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
        {
      {
      
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值