解析SIP消息体

时间:2013-01-24 11:12:18

标签: c sip voip

我正在实施SIP协议,我在解析SIP消息时遇到困难。我正在使用oSIP库。我的代码是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <osip2/osip.h>
#include <osipparser2/osip_parser.h>
#include <string.h>

void main()
{
  int i,error;
  osip_message_t *message;
  char text[]="INVITE sip:jarsku@feanor.pc.lut.fi SIP/2.0\nCall-ID: 123456789@aradan\nVia: SIP/2.0/UDP 157.24.25.137:5060\nFrom: Arto <sip:athamala@feanor.pc.lut.fi>\nTo: Jari <sip:jarsku@feanor.pc.lut.fi>\nCSeq: 1 INVITE\nContent-Type: application/sdp\n\nv=0\na=3333aaa333";
  char *p=(char *)&text;

  i = strlen(text);
  error = osip_init(&message);
  error = osip_message_init(&message);
  error = osip_message_parse(message, p, i);
}

当我运行此代码时,消息结构中填充了来自文本的数据。分别正确填充字段call_id, content_lenght, content_type, cseq, from, req_uri, sip_method, sip_version,和过滤,但在字段消息中,值为0x0,message_length为0,message_property为2。 所有三个命令的错误代码均为0。 为什么没有解析消息体?我对这件事感到困惑: 在RFC中声明,每一行都应以CLRF序列结束,但我只是使用\n,它似乎正在工作。 接下来我不喜欢这句话:

error = osip_init(&message);
error = osip_message_init(&message);

对我来说,这很奇怪。在documentation of oSIP中声明了序列:

osip_message_t *sip;
osip_message_init(&sip);
osip_message_parse(sip, buffer, length_of_buffer);
osip_message_free(sip);

应该足够了(在我的代码中我使用的是init和message_init),但是这给我带来了分段错误。

为什么可能,字段content_length被自动填充但是邮件没有被解析?

最后一个问题:为什么这个主题在互联网上如此可怕?没有手册,oSIP文档不好

谢谢

3 个答案:

答案 0 :(得分:2)

我认为您可能正在阅读错误的文档。函数osip_init()想要osip_t ** osip而不是消息。回复:http://www.gnu.org/software/osip/doc/html/group_howto0_initialize.html

答案 1 :(得分:1)

对于有类似问题的未来窥视:

我得到了与Matka在评论中提到的相同的错误。

  

从osip_message_parse返回值-5

这是由于我在调试时传递给程序的格式错误的消息。

答案 2 :(得分:0)

我知道这是一个老问题,但我偶然发现它。

osip_init不需要仅使用解析器,但您应该使用parser_init()初始化解析器;代替。