Поддержка динамического запроса TURN (ICE) серверов для связи.
This commit is contained in:
@@ -48,6 +48,11 @@ func Bootstrap() {
|
||||
logger.LogInfoMessage("starting without TURN server, peer connections may fail if clients are behind symmetric NATs")
|
||||
} else {
|
||||
logger.LogInfoMessage("server TURN started at 0.0.0.0:3478")
|
||||
// Заполняем глобальные переменные для TURN провайдера, чтобы их могли использовать другие части приложения
|
||||
// Обратите внимание, заполняем их только в случе успешного старта Turn сервера
|
||||
turn.TURN_PASS = os.Getenv("TURN_PASS")
|
||||
turn.TURN_USER = os.Getenv("TURN_USER")
|
||||
turn.TURN_PUBLIC_IP = os.Getenv("TURN_PUBLIC_IP")
|
||||
defer turnServer.Close()
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -15,4 +15,6 @@ var (
|
||||
SDP_ANSWER_RENEGOTIATION = 0x07
|
||||
// Check life для проверки соединения с сервером SFU
|
||||
CHECK_LIFE = 0xAE
|
||||
// Запрос от бекенда на получение данных для подключения к TURN серверу
|
||||
TURN_ASK = 0x19
|
||||
)
|
||||
|
||||
@@ -20,4 +20,6 @@ var (
|
||||
SDP_ANSWER = 0x05
|
||||
// Сервер SFU отправит этот пакет бекенду при получении Check life для подтверждения, что соединение живо
|
||||
CHECK_LIFE_SUCCESS = 0xAE
|
||||
// Ответ от сервера при вопросе о TURN
|
||||
TURN_SERVER = 0x19
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
8
turn/provider.go
Normal file
8
turn/provider.go
Normal file
@@ -0,0 +1,8 @@
|
||||
package turn
|
||||
|
||||
// Заполнится если сервер запустится успешно
|
||||
var (
|
||||
TURN_PUBLIC_IP = ""
|
||||
TURN_USER = ""
|
||||
TURN_PASS = ""
|
||||
)
|
||||
Reference in New Issue
Block a user