2014-10-26 7 views
1

SIP (Session Initiation Protocol) формат пакета является то, что вдоль линий:Как декодировать SIP-пакеты?

INVITE sip:[email protected]:5060 SIP/2.0 
Via: SIP/2.0/UDP 192.168.100.86:5060;rport;branch=z9hG4bKPj3f79189a-581d-4f58-a4dd-bc64e050421c 
Max-Forwards: 70 
From: <sip:192.168.100.86>;tag=60f4c35a-6cdb-4b19-b580-f3d3ad5c1abf 
To: <sip:[email protected]> 
Contact: <sip:192.168.101.86:5060;ob> 
Call-ID: 247ee45e-957a-481a-b97b-82f2429a999d 
CSeq: 17491 INVITE 
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS 
Supported: replaces, 100rel, timer, norefersub 
Session-Expires: 1800 
Min-SE: 90 
User-Agent: PJSUA v2.3 Linux-3.2.0.4/x86_64/glibc-2.13 
Content-Type: application/sdp 
Content-Length: 479 

мне нужно декодировать этот пакет и извлечь некоторые из его полей, как From, To, Call-ID и т.д. Пакет является в формате ASCII, и каждая поданная кодируется в отдельной строке. Кроме того, порядок полей не определен, и они могут быть в любом порядке. Каков наилучший метод для извлечения значения требуемых полей из такого пакета? Мне нужно иметь возможность устанавливать и получать каждое поле отдельно. Самая простая идея, которая приходит мне на ум, - это прочитать пакет за строкой и проверить, начинается ли каждая строка с любого из моих желаемых значений. Я очень ценю любые советы, показывающие мне эффективный способ сделать это.

+0

Вы не сказали, на каком языке/системе вы находитесь, но если вы можете найти C, вы можете найти http://www.gnu.org/software/osip/doc/html/group__howto2__parser.html полезный –

+0

@AdrianMay I Я использовал это, и это ужасно. Я собираюсь развить свою собственную библиотеку. – Meysam

ответ

3

Лично я сделал бы это вручную. Он совершенно детерминирован. В имени поля никогда не будет двоеточия, поэтому вы просто ищите его на каждой строке, нарежьте и заселите карту. Я бы постарался не кодировать определенные поля, такие как «Виа». Просто напишите что-то общее, которое также может читать заголовки электронной почты без изменений кода. Вы могли бы попытаться найти библиотеку, но она принесла бы багаж, который вам не нужен. Это достаточно мало, чтобы писать вручную. Следите за проблемами безопасности, такими как бесконечные строки.

1

Одним из лучших подходов было использование Lex/Yaml. Независимо от того, насколько много общего в каждом из заголовков SIP, каждый из них имеет конкретный шаблон. И один из способов захвата логики синтаксического анализа должен быть разбит на наиболее распространенные базовые типы, определенные в ABNF для SIP. Затем постройте их для каждого заголовка и постепенно постройте его, чтобы покрыть более более интересные заголовки, которые выходят каждые несколько дней из IETF.

Я нашел подход действительно расширяемым, а стеки SIP используют аналогичный подход для синтаксического анализа. Кстати, я бы использовал подход Adrians, если вас интересуют только несколько общих заголовков.

Смежные вопросы