2012-02-02 101 views
2

RTP規範規定,給定RTP流的RTCP數據包將在主RTP端口的+1端口上發送。舉例來說,如果您有視頻到達RTP端口9010,則在端口9011上,您可以預期RTCP數據包。你如何找到一個免費的UDP端口對?

當我正在協商一個單播流(通過RTSP協議)時,我不得不建議一對端口,我希望視頻發送給我(1爲RTP,1爲RTCP)...

現在,我知道如果我綁定一個端口爲0的套接字,系統將從臨時範圍中選擇一個空閒端口......我遇到的問題是我實際上需要一對端口,而且我需要RTCP端口是RTP端口的+1(事實上,我認爲我需要RTP端口是偶數)。

有沒有辦法找到一對空閒端口?這通常如何完成?

回答

5

你得到一個隨機的,然後嘗試下一個。

如果bind()調用中的第二端口上失敗,EADDRINUSE,沖洗和重複...

爲了什麼,如果這兩個電話足夠接近你可能不必再重複了它的價值,在大多數系統序列。

臨時端口通常是按順序分配的,所以下一個端口不會自由的唯一方法是,如果任一端口已經被一個長壽命進程使用(不太可能在UDP上)或者其他人偷偷進入一個bind()呼叫你的兩個之間。同樣,如果你需要RTP端口是偶數的,就隨機選擇第一個端口,如果返回奇數端口,只需再試一次 - 根據上述情況,下一個端口將是偶數!如果沒有,沖洗並重復...

+0

@fyhertz您的編輯是完全錯誤的,並已被還原。操作系統知道哪些臨時端口是免費的,所以您依靠操作系統選擇一個。這將更有可能產生一對連續的隨機端口,而不是讓開發人員隨機選擇一個數字,然後希望O/S尚未使用它。 – Alnitak 2012-11-23 09:27:50