osip_message_to_str在我使用消息/解析器功能创建的消息上失败

时间:2019-07-03 18:07:08

标签: sip

我正在尝试接收邀请消息,然后以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);

我希望能够打印响应消息。

1 个答案:

答案 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。肯定会帮助您解决下一个问题!