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);
}

このコードを実行すると、メッセージ構造はテキストからのデータで埋められます。それぞれのフィールドcall_id, content_lenght, content_type, cseq, from, req_uri, sip_method, sip_version,とビアは正しく入力されていますが、フィールドのメッセージは値0x0、0、message_lengthmessage_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ドキュメントは悪いです

ありがとうございました

4

3 に答える 3

2

ドキュメントを間違って読んでいる可能性があると思います。関数 osip_init() は、メッセージではなく osip_t **osip を必要とします。Re : http://www.gnu.org/software/osip/doc/html/group_howto0_initialize.html _

于 2013-01-25T15:24:23.747 に答える
1

osip_init はパーサーだけを使用するために必要ではありませんが、parser_init() でパーサーを初期化する必要があります。代わりは。

于 2016-04-30T16:03:55.600 に答える
1

彼のコメントで述べたマトカと同じエラーが発生しました。

osip_message_parse からの戻り値 -5

デバッグ中にプログラムに渡していたのは、不正な形式の sip メッセージが原因でした。

于 2013-03-27T15:09:46.050 に答える