如何在做一个SIP邀请请求时保留rtp端口

时间:2015-12-23 10:53:18

标签: sip voip rtp sdp

我正在开发一个VOIP软电话,我需要在我的INVITE请求中将RTP端口号放在SDP部分。如何找到一个免费的UDP端口号来接受RTP数据包。 我找到了2个解决方案,但不知道它们是否是正确的方法。

解决方案1:从UDP端口号(比如7000)开始,查看它是否空闲,如果没有增加1并继续,直到找到空闲端口。然后在该端口上打开一个UDP套接字,这样其他调用就无法选择我的调用RTP端口。 然后发送请求。

解决方案2:从UDP端口号(比如7000)开始,查看它是否空闲,将其放入SDP并发送请求。但是当我得到其他方的响应时(一段时间后),我无法保证我为RTP宣布的端口号仍然可用。也许其他电话已经抓住了。

我想知道最好的方法是什么。

2 个答案:

答案 0 :(得分:0)

解决方案1 ​​是在特定端口范围内保留端口号的唯一方法。

如果您不关心接近特定端口号,只需打开一个值为0的端口,以获得一个随机端口,该端口当然是免费的。然后,使用socket的API检索真实打开的端口,并在sdp中使用它!

答案 1 :(得分:0)

正如AymericM建议的那样,你应该坚持你的解决方案1。

您需要使用bind调用将套接字绑定到端口。

此外,RTP specification表明RTP端口通常应该是偶数,RTCP端口是rtp_port + 1.

  

对于UDP和类似协议,      RTP应该使用偶数目标端口号和相应的      RTCP流应该使用下一个更高(奇数)的目标端口号。

即使在单个端口上支持RTP/RTCP multiplexing的情况下,应答者也可能没有,因此在生成商品时绑定RTP和RTCP端口可能是个好主意。

总而言之,尝试绑定两个连续的端口,从偶数开始,一旦找到两个合适的端口,就生成offer / INVITE。