使用 Stun 的服务器自反传输

Using Stun's server reflexive transport

我正在尝试开发自己的 Lite-ICE 客户端。我能够得到 STUN 响应,它为我提供了我的服务器自反地址。我的问题是关于后面的步骤。

因此,我从分配给本地地址为 L-IP1 和 L-Port1 的 STUN 客户端的 STUN 服务器收到 IP1 和 Port1 作为我的服务器反射地址。

我了解如果 L-IP1 和 L-Port1 被多路复用到 send/receive 非 STUN 消息 to/from 远程服务器,它是如何工作的。

如果我想要另一个应用程序,一个完全独立的进程来使用相同的绑定怎么办?那么,我可以启动另一个应用程序来将 UDP 端口也绑定到 L-Port1 吗?如果是这样,应用程序 (STUN) 和其他应用程序是否都会从远程服务器接收到目标设置为 IP1 和端口 1 的消息(从远程服务器的角度来看)?而那些不理解消息类型或方法的人,就直接忽略它?它通常是这样工作的吗?

What if I want another application, a completely separate process to use the same bindings?

您通常让每个应用程序获取其与不同本地端口的绑定。

So, can I start another application to bound the UDP port to L-Port1 too?

如果另一个进程将套接字绑定到同一本地端口,您将收到套接字绑定错误。有多种解决方法,但请继续阅读,这可能不是您想要的。

If so, will both the applications (STUN) and this other application receive message from the remote servers with destination set to IP1 and Port1 (from the remote server's perspective)?

您可以使用 SO_REUSEADDR 选项。但是,如果您有两个进程的套接字连接到同一个本地 UDP 端口,则该端口的传入数据包将被路由到任一套接字。 (第一个调用 recvfrom 的人获取数据包 - 否则,它是不确定的)。

And the one that does not understand the message type or method, simply ignores it? Is that how it normally work?

没有

我认为您的意思是您在一个进程中执行 STUN,但希望在另一个进程中使用这些绑定的实际应用程序 运行。只需让您的应用程序自己执行 STUN 绑定,然后简单地重新使用套接字来获取数据。如果您尝试在同一个套接字上复用 STUN 和应用程序数据,您将需要(您自己的)代码来区分它们。