1

我正在编写一个小型 UDP 服务器,它可能会在同一端口接收不同的 UDP 协议消息,例如 STUN、RTP、RTCP、DTLS 数据包。

我首先应该能够区分每种协议消息以执行不同的逻辑。

我在哪里可以找到 java 的示例,更好的库来帮助我。

4

2 回答 2

2

这是一个 c++ 版本,我确信它可以用 java 重写,但它让您知道该怎么做。顺便说一句,缓冲区变量保存最近收到的 udp 数据报。

 if((buffer[0]==0) || (buffer[0]==1))
      return stun; // STUN packet

 if((buffer[0]>=128) && (buffer[0]<=191))
      return rtp; // RTP packet

 if((buffer[0]>=20)  && (buffer[0]<=64))
      return dtls; // DTLS packet                                                               
于 2015-04-02T17:43:34.840 回答
1

我首先应该能够区分每种协议消息以执行不同的逻辑。

为什么?我会简单地并行运行逻辑;即,将此端口上的每个数据包传递给每个逻辑。

逻辑应该被设计为忽略格式错误的请求(毕竟,如果它们要在开放的 Internet 上运行,它们应该足够健壮,甚至可以处理恶意制作的数据包)。

如果某些传入请求是-polyglots-;即,它们在多个协议中有效,那么客户端将收到多个响应。在此设计中,由客户端代码处理不合法的响应。也许客户足够强大,可以忽略它们。或者客户端可能会从一开始就重试协议,可能会选择一个新的序列号或不再是多语言的东西(纯属运气)。

我不认为这个问题有一个“非常好的”解决方案,因为 UDP 数据包太小而无法浪费每个协议唯一标识符的空间。UDP 协议旨在为不同的服务使用不同的端口。唯一“正确”的解决方案是将在同一端口上运行的服务放在不同的 IP 地址上。

于 2015-04-02T06:07:25.920 回答