Поддержка динамического запроса TURN (ICE) серверов для связи.

This commit is contained in:
set
2026-03-17 15:27:14 +02:00
parent c8141f00bc
commit 96df1e52f9
5 changed files with 54 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ import (
"g365sfu/network"
"g365sfu/sfu"
connection "g365sfu/socket/struct"
"g365sfu/turn"
"g365sfu/utils"
"net/http"
"os"
@@ -218,5 +219,41 @@ func processData(data <-chan []byte, connection *connection.Connection) {
connection.WriteBinary(response.Bytes())
continue
}
// Запрос от бекенда на получение данных для подключения к TURN серверу
if packetId == byte(network.TURN_ASK) && turn.TURN_PUBLIC_IP != "" {
// Отвечаем только в том случае, если TURN сервер был успешно запущен и данные для подключения к нему были заполнены
// Отправляем два пакета один на tcp сервер другой на udp сервер, так как некоторые клиенты могут поддерживать только один из этих протоколов
//tcp
response := bytebuffer.Allocate(1 + 4 + len([]byte(turn.TURN_PUBLIC_IP)) + 4 + len([]byte(turn.TURN_USER)) + 4 + len([]byte(turn.TURN_PASS)) + 4 + len([]byte("tcp")))
response.Put(byte(network.TURN_SERVER))
response.PutUint32(uint32(len([]byte(turn.TURN_PUBLIC_IP))))
response.PutBytes([]byte(turn.TURN_PUBLIC_IP))
response.PutUint32(uint32(len([]byte(turn.TURN_USER))))
response.PutBytes([]byte(turn.TURN_USER))
response.PutUint32(uint32(len([]byte(turn.TURN_PASS))))
response.PutBytes([]byte(turn.TURN_PASS))
response.PutUint32(uint32(len([]byte("tcp"))))
response.PutBytes([]byte("tcp"))
response.Flip()
connection.WriteBinary(response.Bytes())
//udp
responseUDP := bytebuffer.Allocate(1 + 4 + len([]byte(turn.TURN_PUBLIC_IP)) + 4 + len([]byte(turn.TURN_USER)) + 4 + len([]byte(turn.TURN_PASS)) + 4 + len([]byte("udp")))
responseUDP.Put(byte(network.TURN_SERVER))
responseUDP.PutUint32(uint32(len([]byte(turn.TURN_PUBLIC_IP))))
responseUDP.PutBytes([]byte(turn.TURN_PUBLIC_IP))
responseUDP.PutUint32(uint32(len([]byte(turn.TURN_USER))))
responseUDP.PutBytes([]byte(turn.TURN_USER))
responseUDP.PutUint32(uint32(len([]byte(turn.TURN_PASS))))
responseUDP.PutBytes([]byte(turn.TURN_PASS))
responseUDP.PutUint32(uint32(len([]byte("udp"))))
responseUDP.PutBytes([]byte("udp"))
responseUDP.Flip()
connection.WriteBinary(responseUDP.Bytes())
continue
}
}
}