在 EasyDSS、EasyNVR、EasyCVR、EasyGBS 等视频平台中支持 WebRTC 播放功能,其中有个流程需要到 stun/trun 服务器中进行网络打洞操作。
该服务代码中,原始仅支持 UDP 的连接,在部分情况下,防火墙开启后,会将 UDP 包拦截导致无法连接,因此修改代码支持 TCP 连接的功能。
原始 UDP 连接的代码如下:
代码语言:javascript复制udpListener, err := net.ListenPacket("udp", "0.0.0.0:" strconv.Itoa(config.UdpPort))
if err != nil {
gErrorLog.Panic("Failed to create TURN server udp listener: %s", zap.Error(err))
os.Exit(0)
}
server.udpListener = udpListener
turnServer, err := turn.NewServer(turn.ServerConfig{
Realm: config.Realm,
AuthHandler: server.HandleAuthenticate,
PacketConnConfigs: []turn.PacketConnConfig{
{
PacketConn: udpListener,
RelayAddressGenerator: &turn.RelayAddressGeneratorStatic{
RelayAddress: net.ParseIP(config.PublicIP),
Address: "0.0.0.0",
},
},
},
})
在该代码上添加对应的 TCP 监听连接代码如下:
代码语言:javascript复制udpListener, err := net.ListenPacket("udp", "0.0.0.0:" strconv.Itoa(config.UdpPort))
if err != nil {
gErrorLog.Panic("Failed to create TURN server udp listener: %s", zap.Error(err))
os.Exit(0)
}
server.udpListener = udpListener
tcpListener, err := net.Listen("tcp", "0.0.0.0:" strconv.Itoa(config.TcpPort))
if err != nil {
gErrorLog.Panic("Failed to create TURN server tcp listener: %s", zap.Error(err))
os.Exit(0)
}
server.tcpListener = tcpListener
turnServer, err := turn.NewServer(turn.ServerConfig{
Realm: config.Realm,
AuthHandler: server.HandleAuthenticate,
PacketConnConfigs: []turn.PacketConnConfig{
{
PacketConn: udpListener,
RelayAddressGenerator: &turn.RelayAddressGeneratorStatic{
RelayAddress: net.ParseIP(config.PublicIP),
Address: "0.0.0.0",
},
},
},
ListenerConfigs: []turn.ListenerConfig{
{
Listener: tcpListener,
RelayAddressGenerator: &turn.RelayAddressGeneratorStatic{
RelayAddress: net.ParseIP(config.PublicIP),
Address: "0.0.0.0",
},
},
},
})
使用 netListener() 监听对应的 TCP 端口,再将对应的 TCP 连接加入到 ListenerConfigs 中。在对应的产品配置文件中修改配置使用 TCP 连接。
如图,正常播放。