mirror of
https://github.com/pion/webrtc.git
synced 2025-10-05 07:06:51 +08:00
106 lines
2.4 KiB
Go
106 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/pions/webrtc"
|
|
"github.com/pions/webrtc/pkg/datachannel"
|
|
"github.com/pions/webrtc/pkg/ice"
|
|
)
|
|
|
|
func buildPeerConnection() *webrtc.RTCPeerConnection {
|
|
peerConnection, err := webrtc.New(webrtc.RTCConfiguration{
|
|
IceServers: []webrtc.RTCIceServer{
|
|
{
|
|
URLs: []string{"stun:stun.l.google.com:19302"},
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
d, err := peerConnection.CreateDataChannel("data", nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
d.Lock()
|
|
d.Onmessage = func(payload datachannel.Payload) {
|
|
switch p := payload.(type) {
|
|
case *datachannel.PayloadString:
|
|
fmt.Printf("Message '%s' from DataChannel '%s' payload '%s'\n", p.PayloadType().String(), d.Label, string(p.Data))
|
|
case *datachannel.PayloadBinary:
|
|
fmt.Printf("Message '%s' from DataChannel '%s' payload '% 02x'\n", p.PayloadType().String(), d.Label, p.Data)
|
|
default:
|
|
fmt.Printf("Message '%s' from DataChannel '%s' no payload \n", p.PayloadType().String(), d.Label)
|
|
}
|
|
}
|
|
d.Unlock()
|
|
|
|
peerConnection.OnICEConnectionStateChange = func(connectionState ice.ConnectionState) {
|
|
fmt.Printf("Connection State has changed %s \n", connectionState.String())
|
|
if connectionState == ice.ConnectionStateConnected {
|
|
fmt.Println("sending openchannel")
|
|
err := d.SendOpenChannelMessage()
|
|
if err != nil {
|
|
fmt.Println("faild to send openchannel", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
return peerConnection
|
|
}
|
|
|
|
func main() {
|
|
ln, err := net.Listen("unix", "../pion.sock")
|
|
if err != nil {
|
|
log.Fatal("Failed to listen: ", err)
|
|
}
|
|
|
|
sigc := make(chan os.Signal, 1)
|
|
signal.Notify(sigc, os.Interrupt, syscall.SIGTERM)
|
|
go func(ln net.Listener, c chan os.Signal) {
|
|
sig := <-c
|
|
log.Printf("Caught signal %s: shutting down.", sig)
|
|
ln.Close()
|
|
os.Exit(0)
|
|
}(ln, sigc)
|
|
|
|
fmt.Println("Ready for offer")
|
|
fd, err := ln.Accept()
|
|
if err != nil {
|
|
log.Fatal("Accept error: ", err)
|
|
}
|
|
|
|
buf := make([]byte, 5000)
|
|
n, err := fd.Read(buf)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
peerConnection := buildPeerConnection()
|
|
|
|
if err := peerConnection.SetRemoteDescription(webrtc.RTCSessionDescription{
|
|
Type: webrtc.RTCSdpTypeOffer,
|
|
Sdp: string(buf[0:n]),
|
|
}); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
answer, err := peerConnection.CreateAnswer(nil)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if _, err := fd.Write([]byte(answer.Sdp)); err != nil {
|
|
log.Fatal("Writing client error: ", err)
|
|
}
|
|
select {}
|
|
}
|