我正在实现SIP协议(protocol),并且在解析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:[email protected] SIP/2.0\nCall-ID: 123456789@aradan\nVia: SIP/2.0/UDP 157.24.25.137:5060\nFrom: Arto <sip:[email protected]>\nTo: Jari <sip:[email protected]>\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但未解析消息?

最后一个问题:为什么这个主题在Internet上被如此广泛地涵盖?没有手册,oSIP文档很糟糕

谢谢

最佳答案

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

关于c - 解析SIP消息正文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14499944/

10-08 22:42