2015-12-23 4 views
0

Я разрабатываю программный телефон VOIP, мне нужно поместить номер порта RTP в часть SDP в мой запрос INVITE. как я могу найти бесплатный номер порта UDP для приема пакетов RTP. Я нашел 2 решения, но не знаю, правильно ли они это делают.Как зарезервировать порт rtp при принятии глотка INVITE-запрос

Решение 1: начните с номера порта UDP (скажем, 7000) и проверьте, свободен ли он, если он не увеличивается на 1 и продолжается до тех пор, пока не будет найден свободный порт. затем откройте сокет UDP на этом порту, чтобы другие вызовы не могли выбрать мой RTP-порт. затем отправьте запрос.

Решение 2: начать с номера порта UDP (скажем, 7000) и посмотреть, бесплатно ли оно, поместить его в SDP и отправить запрос. но когда я получаю OK ответ от другой стороны (через некоторое время), нет никакой гарантии, что номер порта, который я объявил для RTP, по-прежнему доступен. возможно, другой звонок взял это.

Я хотел бы знать, что является лучшим способом для этого.

ответ

0

Как предложил AymericM, вы должны придерживаться своего решения 1.

Вы должны использовать bind вызов, чтобы связать сокет к порту.

Кроме того, RTP specification заявляет, что порт RTP, как правило, должна быть ровной, с портом протокола RTCP является rtp_port + 1.

Для UDP и аналогичные протоколы, RTP, следует использовать даже номер порта назначения и соответствующий поток RTCP СЛЕДУЕТ использовать следующий более высокий (нечетный) номер порта назначения.

Даже в том случае, когда вы поддерживаете RTP/RTCP multiplexing через один порт, ответчик не может, так что это может быть хорошей идеей, чтобы связать как RTP и RTCP портов при создании предложения.

Итак, попробуйте связать два последовательных порта, начиная с четного числа, и как только вы найдете два подходящих порта, сгенерируйте предложение/INVITE.

0

Решение 1 - единственный способ зарезервировать номер порта в определенном диапазоне портов.

Если вы не хотите быть близким к определенному номеру порта, просто откройте порт со значением 0, чтобы получить случайный порт, который, конечно, будет бесплатным. Затем загрузите настоящий открытый порт с помощью API-интерфейса socket и используйте его в своем sdp!

+0

Спасибо, мне понравилось, и это сработало. –