osip_message_to_str 在我使用 message/parser 函数创建的消息上失败

osip_message_to_str fails on a message I created using the message/parser functions

我正在尝试接收邀请消息,然后回复 100 尝试 and/or 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);

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

来自 libosip2,文件 osip_port.h,错误 return 代码 -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”从响应中检索联系人。但是有none。为了设置联系人,您需要搜索您的 IP 地址、端口号和要添加的参数。建议这样:

osip_message_set_contact (response, "<sip:192.168.1.10:5678;ob>");

上面的 API 会将字符串解析为联系人 header 并将其添加到响应中。

为了清楚(如您所用),“response->req_uri”为空响应。表示"Request-URI",仅供请求。

如果您希望获得完整的回复,您还需要复制所有“Via”headers:

{
  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_strdup 而不是 strdup 进行任何 osip 分配,以使您的代码更具可移植性。

osip_message_to_str 应该可以了!

如需更精确的代码,请随时查看我的 exosip2 代码 here。一定会对你的下一个问题有所帮助!