Обработка пакетов SDP от клиента

This commit is contained in:
set
2026-03-11 21:00:19 +02:00
parent b81ae8a3c0
commit 181ddb921e
4 changed files with 64 additions and 25 deletions

View File

@@ -1,18 +1,14 @@
package sfu package sfu
import ( import (
"g365sfu/socket" connection "g365sfu/socket/struct"
"g365sfu/utils" "g365sfu/utils"
"sync" "sync"
"github.com/pion/webrtc/v4" "github.com/pion/webrtc/v4"
) )
// Общие переменные // Структуры для управления комнатами и пирами в SFU
var (
rooms = make(map[string]*Room)
roomsMu sync.RWMutex
)
type Peer struct { type Peer struct {
//Идентификатор пира, который будет использоваться для связи с ним //Идентификатор пира, который будет использоваться для связи с ним
@@ -25,20 +21,26 @@ type Room struct {
//Уникальный идентификатор комнаты //Уникальный идентификатор комнаты
RoomID string RoomID string
//Сервер который создал комнату //Сервер который создал комнату
Server []*socket.Connection Server *connection.Connection
//Пиры которые подключились к комнате //Пиры которые подключились к комнате
Peers []Peer Peers []Peer
} }
// Общие переменные
var (
rooms = make(map[string]*Room)
roomsMu sync.RWMutex
)
// CreateRoom создает комнату // CreateRoom создает комнату
func CreateRoom() (*Room, error) { func CreateRoom(server *connection.Connection) (*Room, error) {
roomID := "room_" + utils.RandomString(64) roomID := "room_" + utils.RandomString(64)
roomsMu.Lock() roomsMu.Lock()
defer roomsMu.Unlock() defer roomsMu.Unlock()
room := &Room{ room := &Room{
RoomID: roomID, RoomID: roomID,
Server: []*socket.Connection{}, Server: server,
Peers: []Peer{}, Peers: []Peer{},
} }
rooms[roomID] = room rooms[roomID] = room

View File

@@ -1,9 +1,8 @@
package socket package socket
import ( import (
connection "g365sfu/socket/struct"
"sync" "sync"
"github.com/gorilla/websocket"
) )
// Это хранилище для всех подключённых сокетов. // Это хранилище для всех подключённых сокетов.
@@ -13,20 +12,14 @@ import (
// Здесь содержатся только соединения прошедшие рукопожатие // Здесь содержатся только соединения прошедшие рукопожатие
type Connection struct {
Identificator string
//Подсоединенный сокет
Socket *websocket.Conn
}
// Потокобезопасное хранилище подключённых сокетов // Потокобезопасное хранилище подключённых сокетов
var ( var (
handshakeCompletedSockets = make(map[string]*Connection) handshakeCompletedSockets = make(map[string]*connection.Connection)
socketsMutex = sync.RWMutex{} socketsMutex = sync.RWMutex{}
) )
// Добавление сокета в хранилище // Добавление сокета в хранилище
func AddSocket(conn *Connection) { func AddSocket(conn *connection.Connection) {
socketsMutex.Lock() socketsMutex.Lock()
defer socketsMutex.Unlock() defer socketsMutex.Unlock()
handshakeCompletedSockets[conn.Identificator] = conn handshakeCompletedSockets[conn.Identificator] = conn
@@ -40,7 +33,7 @@ func RemoveSocket(identificator string) {
} }
// Получение сокета по идентификатору // Получение сокета по идентификатору
func GetSocket(identificator string) (*Connection, bool) { func GetSocket(identificator string) (*connection.Connection, bool) {
socketsMutex.RLock() socketsMutex.RLock()
defer socketsMutex.RUnlock() defer socketsMutex.RUnlock()
conn, exists := handshakeCompletedSockets[identificator] conn, exists := handshakeCompletedSockets[identificator]
@@ -48,10 +41,10 @@ func GetSocket(identificator string) (*Connection, bool) {
} }
// Получение всех сокетов // Получение всех сокетов
func GetAllSockets() []*Connection { func GetAllSockets() []*connection.Connection {
socketsMutex.RLock() socketsMutex.RLock()
defer socketsMutex.RUnlock() defer socketsMutex.RUnlock()
connections := make([]*Connection, 0, len(handshakeCompletedSockets)) connections := make([]*connection.Connection, 0, len(handshakeCompletedSockets))
for _, conn := range handshakeCompletedSockets { for _, conn := range handshakeCompletedSockets {
connections = append(connections, conn) connections = append(connections, conn)
} }

View File

@@ -1,12 +1,16 @@
package socket package socket
import ( import (
"encoding/json"
"g365sfu/logger" "g365sfu/logger"
"g365sfu/sfu"
connection "g365sfu/socket/struct"
"g365sfu/utils" "g365sfu/utils"
"net/http" "net/http"
"os" "os"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/pion/webrtc/v4"
) )
var upgrader = websocket.Upgrader{ var upgrader = websocket.Upgrader{
@@ -31,7 +35,7 @@ func HandleWebSocket(w http.ResponseWriter, r *http.Request) {
// Канал для передачи байтов // Канал для передачи байтов
dataChan := make(chan []byte) dataChan := make(chan []byte)
var connection = &Connection{ var connection = &connection.Connection{
Identificator: randomSocketIdentifier(), Identificator: randomSocketIdentifier(),
Socket: conn, Socket: conn,
} }
@@ -58,7 +62,7 @@ func randomSocketIdentifier() string {
return "sock_" + utils.RandomString(10) return "sock_" + utils.RandomString(10)
} }
func processData(data <-chan []byte, connection *Connection) { func processData(data <-chan []byte, connection *connection.Connection) {
for bytes := range data { for bytes := range data {
// Логика обработки байтов // Логика обработки байтов
if bytes[0] == 0x01 { if bytes[0] == 0x01 {
@@ -84,6 +88,35 @@ func processData(data <-chan []byte, connection *Connection) {
return return
} }
// Следующие типы сообщений // Создание комнаты
if bytes[0] == 0x02 {
room, _ := sfu.CreateRoom(connection)
logger.LogSuccessMessage("room initializated " + room.RoomID)
bytes = append([]byte{0x02}, []byte(room.RoomID)...)
connection.Socket.WriteMessage(websocket.BinaryMessage, bytes)
return
}
//SDP OFFER для подключения к комнате
if bytes[0] == 0x03 {
roomIdLen := int(bytes[1])
roomID := string(bytes[2 : 2+roomIdLen])
_, exists := sfu.GetRoom(roomID)
if !exists {
logger.LogWarnMessage("peer " + connection.Socket.RemoteAddr().String() + " tried to join non existing room " + roomID)
return
}
peerIdLen := int(bytes[2+roomIdLen])
peerID := string(bytes[3+roomIdLen : 3+roomIdLen+peerIdLen])
logger.LogSuccessMessage("peer " + connection.Socket.RemoteAddr().String() + " joined to room " + roomID)
var offer webrtc.SessionDescription
err := json.Unmarshal(bytes[3+roomIdLen+peerIdLen:], &offer)
if err != nil {
logger.LogWarnMessage("failed to unmarshal offer from peer " + connection.Socket.RemoteAddr().String() + ": " + err.Error())
return
}
sfu.JoinWithOffer(roomID, peerID, offer)
return
}
} }
} }

View File

@@ -0,0 +1,11 @@
package connection
import (
"github.com/gorilla/websocket"
)
type Connection struct {
Identificator string
//Подсоединенный сокет
Socket *websocket.Conn
}