Анализировать пакет SIP в C

Я пытаюсь разобрать SIP-пакет и получить из него некоторую информацию. Чтобы быть более конкретным, пакет выглядит так

REGISTER sip:open-ims.test SIP/2.0
Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK1489975971
From: <sip:alice@open-ims.test>;tag=1627897650
To: <sip:alice@open-ims.test>
Call-ID: 1097412971
CSeq: 1 REGISTER
Contact: <sip:alice@192.168.1.64:5060;line=5fc3b39f127158d>;+sip.instance="<urn:uuid:46f525fe-3f60-11e0-bec1-d965d1488cfa>"
Authorization: Digest username="alice@open-ims.test", realm="open-ims.test", nonce=" ", uri="sip:open-ims.test", response=" "
Max-Forwards: 70
User-Agent: UCT IMS Client
Expires: 600000
Supported: path
Supported: gruu
Content-Length: 0

Теперь из этого пакета мне нужно извлечь следующее:

  • Значение после «From:» (в данном случае )
  • Значение после «Contact:» (в данном случае )
  • Значение после «имени пользователя» (в данном случае alice@open-ims.test)

Пока что мой код выглядит так

char * tch;
      char * saved;                    
      tch = strtok (payload,"<>;");
      while (tch != NULL)
      { 
        int savenext = 0;              
        if (!strcmp(tch, "From: "))     
        {                              
          savenext = 1;                
        }                              

        tch = strtok (NULL, "<>;");
        if (savenext == 1)             
        {                              
          saved = tch;                 
        }                              
      }
      printf ("### SIP Contact: %s ###\n", saved);  
        }
    }

Где полезная нагрузка содержит пакет, как описано выше.

Однако, когда я запускаю свою программу, это приведет к ошибке сегментации. Странно то, что если я использую в strtok символы «<> ;:», а в strcmp значение «sip», сообщение будет успешно проанализировано и сохранит сохраненное значение. Но мне нужно проанализировать все три верхних значения.

Поможет ли мне библиотека sip больше в решении моей проблемы?

Заранее спасибо

5
задан Rup 23 February 2011 в 15:42
поделиться