我正在尝试接收邀请消息,然后以100次尝试和/或180次响铃向同一客户端回复。我只想使用libosip2中的解析器。
因此,当我尝试发送osip_message_to_str
以便有一个要发回的缓冲区时,它总是失败并显示-2
。
我尝试克隆所有我认为合理的字段。但是仍然有同样的问题。
如果我尝试osip_message_to_str
处理收到的消息,则效果很好。
parser_init();
osip_message_t *request = received_buffer(buffer); // the message is received properly from the buffer
osip_message_t *response;
int i = osip_message_init(&response);
if (i != 0) {
fprintf(stderr, "cannot allocate\n");
return -1;
}
osip_message_set_version(response, strdup("SIP/2.0"));
osip_message_set_status_code(response, 100);
osip_from_clone(request->from, &response->from);
osip_to_clone(request->to, &response->to); /* include the tag! */
osip_call_id_clone(request->call_id, &response->call_id);
osip_contact_t *contact = nullptr;
osip_message_get_contact(response, 0, &contact);
osip_uri_clone(osip_contact_get_url(contact), &response->req_uri);
osip_cseq_clone(request->cseq, &(response->cseq));
char *dest = NULL;
size_t length = 0;
i = osip_message_to_str(response, &dest, &length);
if (i != 0) {
fprintf(stderr, "resp cannot get printable message %d\n", i);
return -1;
}
fprintf(stdout, "message:\n%s\n", dest);
我希望能够打印响应消息。
答案 0 :(得分:0)
从libosip2的osip_port.h文件中,错误返回码-2表示参数错误:
#define OSIP_BADPARAMETER -2
答案的第一行是这样的:“ SIP / 2.0 100 Trying ”。
在代码中,您正在正确设置“ SIP / 2.0 ”和“ 100 ”。但是,您忘记了原因短语。对于“ 100 ”,显然,字符串应为“ Trying ”。因此,响应的完整第一行应使用:
osip_message_set_version(response, osip_strdup("SIP/2.0"));
osip_message_set_status_code(response, 100);
//ADD THIS
osip_message_set_reason_phrase (answer, osip_strdup("Trying");
以上内容将解决第一个错误,但看起来还有更多。您正在使用“ osip_message_get_contact ”从响应中检索联系人。但是没有。为了设置联系人,您需要搜索您的IP地址,端口号和要添加的参数。建议这样的事情:
osip_message_set_contact (response, "<sip:192.168.1.10:5678;ob>");
以上API将字符串解析为Contact头并将其添加到响应中。
为清楚起见(如您所用),对于响应,“ response-> req_uri ”为空。它表示“ Request-URI”,仅用于请求。
如果您希望得到完整的答复,则还需要复制所有“ Via ”标头:
{
osip_list_iterator_t it;
osip_via_t *via = (osip_via_t *) osip_list_get_first (&request->vias, &it);
while (via != NULL) {
osip_via_t *via2;
i = osip_via_clone (via, &via2);
if (i != 0) {
osip_message_free (response);
return i;
}
osip_list_add (&response->vias, via2, -1);
via = (osip_via_t *) osip_list_get_next (&it);
}
}
注意:对于任何osip分配,请使用osip_strdup而不是strdup来使代码更可移植。
osip_message_to_str应该可以正常工作!
有关更精确的代码,请随时查看我的exosip2代码here。肯定会帮助您解决下一个问题!