Сбой osip_message_to_str в сообщении, которое я создал с помощью функций message / parser - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь получить сообщение с приглашением, а затем ответить 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 голосов
/ 03 июля 2019

Из 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 проанализирует строку как заголовок контакта и добавит ее в ответ.

Чтобы сделать ее понятной (как вы ее использовали), " response-> req_uri " пуст для ответа.Это означает «Request-URI», который предназначен только для запроса.

Если вы хотите получить полный ответ, вам также необходимо скопировать все заголовки « Через »:

{
  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 код здесь .Это наверняка поможет вам в следующем вопросе, который у вас возникнет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...