我想解析一个SIP数据包并从中获取一些信息。具体而言,该数据包看起来像这样解析SIP数据包C
REGISTER sip:open-ims.test SIP/2.0
Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK1489975971
From: <sip:[email protected]>;tag=1627897650
To: <sip:[email protected]>
Call-ID: 1097412971
CSeq: 1 REGISTER
Contact: <sip:[email protected]:5060;line=5fc3b39f127158d>;+sip.instance="<urn:uuid:46f525fe-3f60-11e0-bec1-d965d1488cfa>"
Authorization: Digest username="[email protected]", 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
现在,从包我需要提取以下内容:
- 值后,“从:”(在这种情况下
<sip:[email protected]>
) - 后的值:(在此情况下
<sip:[email protected]
)后 - 值 “用户名”(在这种情况下
[email protected]
)
到目前为止我的代码是这个
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图书馆会帮助我解决我的问题吗?
在此先感谢
一般而言,当您需要解析或构建像这样的结构化文本时,使用库是一个不错的主意,因为编码中总是存在需要处理的角落案例 - 而其他人已经为您完成了这项工作。假设,就是说,你可以找到足够简单和轻量级的东西来链接你正在做的事情。 – Rup 2011-02-23 15:46:33