我正在实现 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 文档很糟糕
谢谢