Как вы находите свободную пару портов UDP? - PullRequest
2 голосов
/ 03 февраля 2012

В спецификации RTP говорится, что пакеты RTCP для данного потока RTP будут отправляться через порт, который равен +1 от основного порта RTP.Так, например, если у вас есть видео, поступающее на порт RTP 9010, то на порт 9011 можно ожидать пакеты RTCP.

Когда я веду переговоры по одноадресному потоку (через протокол RTSP), я должен предложитьпара портов, по которым я хотел бы, чтобы видео отправлялось мне (1 для RTP и 1 для RTCP) ...

Теперь я знаю, что если я свяжу сокет с портом 0, системавыберет свободный порт из эфемерного диапазона ... У меня проблема в том, что мне действительно нужна пара портов, и мне нужно, чтобы порт RTCP был равен +1 от порта RTP (на самом деле, я думаю, что мне нужен RTPномер порта должен быть четным).

Есть ли способ найти пару свободных портов?Как это обычно делается?

1 Ответ

5 голосов
/ 03 февраля 2012

Вы получаете случайный, затем попробуйте следующий.

Если вызов bind() на втором порту завершается неудачно с EADDRINUSE, промойте и повторите ...

Что бы это ни стоило, в большинстве систем, если два вызова достаточно близки, вам, вероятно, не придется повторять последовательность.

Эфемерные порты обычно назначаются последовательно, поэтому единственный путь, которым следующий порт не будетfree будет, если порт уже используется долгоживущим процессом (маловероятно, по UDP), или если кто-то перебил вызов bind() между вашими двумя.

Аналогично, если вам нуженRTP-порт должен быть четным, просто выберите случайным образом первый, и если он вернет нечетный порт, попробуйте еще раз - в соответствии с вышеизложенным, вероятность того, что следующий порт будет четным!Если нет, промойте и повторите ...

...