powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
7 сообщений из 7, страница 1 из 1
А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
    #38606737
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясню. Задается диапазон RTP-портов.
rtpIpBase-rtpIpMax
Если заданы некорректная пара (rtpIpBase,rtpIpMax) то делается коррекция
и на выходе всегда имеем корректную пару (newBase, newMax)

Проблемка в чем:
(0,0) дает (5000,5199)
Но если сохранить (5000,5199) и подать снова на "вход",
то (5000,5199) даст (5000,5198)

Т.е. не позднее второй итерации получаем стабильные значения с четными номерами портов по краям
А вот как сделать, чтоб с первой итерации получалась стабильная пара и необязательно с четными числами?
Я где-то год назад пытался менять, все мои попытки закончились тем, что пары плавали постоянно, т.е. при каждой итерации что нибудь да сдвинется на единичку (что вообще неприемлимо).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
void OpalManager::SetRtpIpPorts(unsigned rtpIpBase, unsigned rtpIpMax)
{
  rtpIpPorts.Set((rtpIpBase+1)&0xfffe, rtpIpMax&0xfffe, 199, 5000);

...
}

void OpalManager::PortInfo::Set(unsigned newBase,
                                unsigned newMax,
                                unsigned range,
                                unsigned dflt)
{
  if (newBase == 0) {
    newBase = dflt;
    newMax = dflt;
    if (dflt > 0)
      newMax += range;
  }
  else {
    if (newBase < 1024)
      newBase = 1024;
    else if (newBase > 65500)
      newBase = 65500;

    if (newMax <= newBase)
      newMax = newBase + range;
    if (newMax > 65535)
      newMax = 65535;
  }

...
}



Проблема в том, что в настройках я хочу сохранить (rtpIpBase,rtpIpMax) и сразу скорректировать так, чтобы был сохранен валидный диапазон, причем он отвечал тому, что реально сделает Opal при запуске.

Т.е. пока что мне пришла только идея "двойной проверки".
Но вот то что нельзя задать "нечетные" по краям - это несколько бесит.
По RFC я на это имею право.
И потом для каждого VOIP вызова нужна пара портов, а в вычисляемом диапазоне всегда нечетное к-во портов.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
Option Explicit

Private Sub CommandPorts_Click()
   Dim myBase As Long
   Dim myMax As Long
   myBase = CLng(Val(TextRTPmin.Text)) 'задано от балды юзером
   myMax = CLng(Val(TextRTPmax.Text)) 'задано от балды юзером
   CorrectRtpIpPorts myBase, myMax 'проходим двойную проверку по тому же алгоритму что и Opal
   TextRTPmin.Text = CStr(myBase) 'скорректированное значение, его и сохраняем
   TextRTPmax.Text = CStr(myMax) 'скорректированное значение, его и сохраняем
End Sub

Private Sub CorrectRtpIpPorts(ByRef rtpIpBase As Long, ByRef rtpIpMax As Long)
  'чтобы получить стабильные непрыгающие значения, надо применить дважды
  SetRtpIpPorts rtpIpBase, rtpIpMax
  SetRtpIpPorts rtpIpBase, rtpIpMax
End Sub

Private Sub SetRtpIpPorts(ByRef rtpIpBase As Long, ByRef rtpIpMax As Long)
  Dim m_Base As Long
  Dim m_Max As Long
  m_Base = (rtpIpBase + 1) And &HFFFE
  m_Max = rtpIpMax And &HFFFE
  
  SetPorts m_Base, m_Max, 199, 5000
  rtpIpBase = m_Base
  rtpIpMax = m_Max
End Sub

Private Sub SetPorts(ByRef newBase As Long, ByRef newMax As Long, _
 ByVal range As Long, ByVal dflt As Long)
  If newBase = 0 Then
    newBase = dflt
    newMax = dflt
    If dflt > 0 Then newMax = newMax + range
  Else
    If newBase < 1024 Then
      newBase = 1024
    ElseIf newBase > 65500 Then
      newBase = 65500
    End If

    If newMax <= newBase Then newMax = newBase + range
    If newMax > 65535 Then newMax = 65535
  End If
End Sub
...
Рейтинг: 0 / 0
А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
    #38606744
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 необязательно с четными числами?
нет, по стандарту номер RTP порта - чётный (парный нечётный используется для RTCP)
...
Рейтинг: 0 / 0
А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
    #38606758
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77 необязательно с четными числами?
нет, по стандарту номер RTP порта - чётный (парный нечётный используется для RTCP)
Наверно ты прав. Счас проверил в Wireshark.
Если первый вызов использует 5000, то второй 5002 и т.д.

Ну допустим.
А как тогда сделать чтоб код не ошибался в первой итерации и сразу вычислял (0,0) -> (5000,5198) ?

Но с другой стороны двойного прохождения алгоритма коррекции при сохранении диапазона портов (код VB) достаточно чтоб заказанное соответствовало исполняемому (вход соответствовал выходу). В принципе на этом можно остановиться.
...
Рейтинг: 0 / 0
А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
    #38606763
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

порты с номером менее 1024 использовать не следует.

(0,0) - пара явно некорректная
...
Рейтинг: 0 / 0
А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
    #38606775
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилпорты с номером менее 1024 использовать не следует.
(0,0) - пара явно некорректная
Конечно некорректная. На код смотрел (и C++, и VB)?
Его назначение -как раз в том чтоб превратить некорректную пару в корректную.
Но первая корректная (которую код подсчитал) при повторной "проверке" может оказаться "слегка некорректной", т.е. он ее тоже пересчитает.
В этом и вопросик.

P.S. Я на всякий случай VB-6 проект с exe-шником (реализующий этот алгоритм) приложил.
...
Рейтинг: 0 / 0
А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
    #38606804
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поменять думаю можно так (четный стандартный диапазон и четный верхний предел).
Тогда он не будет дурить с нечетными портами и будет конечный результат за одну коррекцию.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
void OpalManager::SetRtpIpPorts(unsigned rtpIpBase, unsigned rtpIpMax)
{
  rtpIpPorts.Set((rtpIpBase+1)&0xfffe, rtpIpMax&0xfffe, 198, 5000);

...
}

void OpalManager::PortInfo::Set(unsigned newBase,
                                unsigned newMax,
                                unsigned range,
                                unsigned dflt)
{
  if (newBase == 0) {
    newBase = dflt;
    newMax = dflt;
    if (dflt > 0)
      newMax += range;
  }
  else {
    if (newBase < 1024)
      newBase = 1024;
    else if (newBase > 65500)
      newBase = 65500;

    if (newMax <= newBase)
      newMax = newBase + range;
    if (newMax > 65534)
      newMax = 65534;
  }

...
}
...
Рейтинг: 0 / 0
А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
    #38610167
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, со мной почти согласились:

Small fixes for getting listening to consecutive ports on sockets (e.g. RTP)

Make sure RTP port range is always even.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
-  m_rtpIpPorts.Set((rtpIpBase+1)&0xfffe, rtpIpMax&0xfffe, 199, 5000);
+  m_rtpIpPorts.Set(rtpIpBase&0xfffe, rtpIpMax&0xfffe, 198, 5000);

-    if (newMax > 65535)
-      newMax = 65535;
+    if (newMax > 65530) // Room for something to get 5 consecutive ports.
+      newMax = 65530;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / А опытным взглядом, можно что-то поменять в ф-ции (корректирует диапазон RTP портов)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]