3

我正在实现 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);
}

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

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

对我来说,这很奇怪吗。在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 文档很糟糕

谢谢

4

3 回答 3

2

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

于 2013-01-25T15:24:23.747 回答
1

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

从 osip_message_parse 返回值 -5

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

于 2013-03-27T15:09:46.050 回答
1

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

于 2016-04-30T16:03:55.600 回答