package main import ( "context" "crypto/tls" "fmt" "net" "time" "github.com/pion/dtls/v2" "github.com/pion/dtls/v2/examples/util" "github.com/pion/dtls/v2/pkg/crypto/selfsign" ) func main() { // Prepare the IP to connect to addr := &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 4444} // Generate a certificate and private key to secure the connection certificate, genErr := selfsign.GenerateSelfSigned() util.Check(genErr) // Create parent context to cleanup handshaking connections on exit. ctx, cancel := context.WithCancel(context.Background()) defer cancel() // // Everything below is the pion-DTLS API! Thanks for using it ❤️. // // Prepare the configuration of the DTLS connection config := &dtls.Config{ Certificates: []tls.Certificate{certificate}, ExtendedMasterSecret: dtls.RequireExtendedMasterSecret, // Create timeout context for accepted connection. ConnectContextMaker: func() (context.Context, func()) { return context.WithTimeout(ctx, 30*time.Second) }, } // Connect to a DTLS server listener, err := dtls.Listen("udp", addr, config) util.Check(err) defer func() { util.Check(listener.Close()) }() fmt.Println("Listening") // Simulate a chat session hub := util.NewHub() go func() { for { // Wait for a connection. conn, err := listener.Accept() util.Check(err) // defer conn.Close() // TODO: graceful shutdown // `conn` is of type `net.Conn` but may be casted to `dtls.Conn` // using `dtlsConn := conn.(*dtls.Conn)` in order to to expose // functions like `ConnectionState` etc. // Register the connection with the chat hub if err == nil { hub.Register(conn) } } }() // Start chatting hub.Chat() }