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、0、message_length
message_propertyは2です。3つのコマンドすべてのエラーコードは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ドキュメントは悪いです
ありがとうございました