Skip to content

Commit 09bdf5e

Browse files
committed
Add example
1 parent cb2c7f1 commit 09bdf5e

File tree

4 files changed

+219
-6
lines changed

4 files changed

+219
-6
lines changed

example/chat/dial/main.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"flag"
6+
"fmt"
7+
"net"
8+
9+
"github.com/pion/dtls/v3/examples/util"
10+
quic "github.com/refraction-networking/uquic"
11+
tls "github.com/refraction-networking/utls"
12+
)
13+
14+
func main() {
15+
var remoteAddr = flag.String("raddr", "127.0.0.1:6666", "remote address")
16+
// var pubkey = flag.String("secret", "0b63baad7f2f4bb5b547c53adc0fbb179852910607935e6f4b5639fd989b1156", "shared secret")
17+
// var covert = flag.String("covert", "1.2.3.4:5678", "covert address")
18+
flag.Parse()
19+
20+
addr, err := net.ResolveUDPAddr("udp", *remoteAddr)
21+
util.Check(err)
22+
23+
// pubkeyBytes, err := hex.DecodeString(*pubkey)
24+
// util.Check(err)
25+
26+
pconn, err := net.ListenUDP("udp", nil)
27+
util.Check(err)
28+
quicSpec, err := quic.QUICID2Spec(quic.QUICFirefox_116)
29+
util.Check(err)
30+
for _, ext := range quicSpec.ClientHelloSpec.Extensions {
31+
if ks, ok := ext.(*tls.KeyShareExtension); ok {
32+
ks.KeyShares = []tls.KeyShare{
33+
{
34+
Group: tls.X25519Kyber768Draft00,
35+
Data: []byte{},
36+
},
37+
}
38+
break
39+
}
40+
}
41+
42+
tp := quic.UTransport{
43+
Transport: &quic.Transport{
44+
Conn: pconn,
45+
},
46+
QUICSpec: &quicSpec,
47+
}
48+
49+
// tp := &quic.Transport{
50+
// Conn: pconn,
51+
// }
52+
53+
// econn1, err := tp.DialEarly(context.Background(), addr, &tls.Config{
54+
// InsecureSkipVerify: true,
55+
// NextProtos: []string{"h3"},
56+
// }, &quic.Config{})
57+
// util.Check(err)
58+
// _ = econn1
59+
60+
econn, err := tp.DialEarly(context.Background(), addr, &tls.Config{
61+
InsecureSkipVerify: true,
62+
// CurvePreferences: []tls.CurveID{tls.X25519Kyber768Draft00},
63+
NextProtos: []string{"h3"},
64+
}, &quic.Config{})
65+
util.Check(err)
66+
67+
stream, err := econn.OpenStream()
68+
util.Check(err)
69+
70+
stream2, err := econn.OpenStream()
71+
util.Check(err)
72+
73+
fmt.Println("Connected; type 'exit' to shutdown gracefully")
74+
75+
stream2.Write([]byte("testt\n"))
76+
77+
// Simulate a chat session
78+
util.Chat(stream)
79+
80+
}

example/chat/listen/main.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
2+
// SPDX-License-Identifier: MIT
3+
package main
4+
5+
import (
6+
"context"
7+
"crypto/rand"
8+
"crypto/rsa"
9+
"crypto/x509"
10+
"encoding/hex"
11+
"encoding/pem"
12+
"flag"
13+
"fmt"
14+
"math/big"
15+
"net"
16+
"time"
17+
18+
"github.com/pion/dtls/v3/examples/util"
19+
quic "github.com/refraction-networking/uquic"
20+
tls "github.com/refraction-networking/utls"
21+
)
22+
23+
const (
24+
receiveMTU = 8192
25+
cidSize = 8
26+
keySize = 32
27+
station_privkey = "203963feed62ddda89b98857940f09866ae840f42e8c90160e411a0029b87e60"
28+
)
29+
30+
type streamConn struct {
31+
quic.Stream
32+
quic.Connection
33+
}
34+
35+
func main() {
36+
var listenAddr = flag.String("laddr", "0.0.0.0:6666", "listen address")
37+
38+
flag.Parse()
39+
40+
// Prepare the IP to connect to
41+
addr, err := net.ResolveUDPAddr("udp", *listenAddr)
42+
util.Check(err)
43+
44+
priv, err := hex.DecodeString(station_privkey)
45+
util.Check(err)
46+
47+
fmt.Printf("%v\n", priv)
48+
49+
pconn, err := net.ListenUDP("udp", addr)
50+
util.Check(err)
51+
tp := quic.Transport{
52+
Conn: pconn,
53+
}
54+
55+
listener, err := tp.ListenEarly(generateTLSConfig(), &quic.Config{})
56+
util.Check(err)
57+
58+
// Simulate a chat session
59+
hub := util.NewHub()
60+
61+
go func() {
62+
for {
63+
// Wait for a connection.
64+
econn, err := listener.Accept(context.Background())
65+
if err != nil {
66+
continue
67+
}
68+
69+
for i := 0; i < 2; i++ {
70+
ctx, _ := context.WithTimeout(context.Background(), 1*time.Second)
71+
stream, err := econn.AcceptStream(ctx)
72+
if err != nil {
73+
continue
74+
}
75+
hub.Register(&streamConn{Stream: stream, Connection: econn})
76+
77+
}
78+
79+
// `conn` is of type `net.Conn` but may be casted to `dtls.Conn`
80+
// using `dtlsConn := conn.(*dtls.Conn)` in order to to expose
81+
// functions like `ConnectionState` etc.
82+
83+
// Register the connection with the chat hub
84+
}
85+
}()
86+
87+
// Start chatting
88+
hub.Chat()
89+
}
90+
91+
// Setup a bare-bones TLS config for the server
92+
func generateTLSConfig() *tls.Config {
93+
key, err := rsa.GenerateKey(rand.Reader, 1024)
94+
if err != nil {
95+
panic(err)
96+
}
97+
template := x509.Certificate{SerialNumber: big.NewInt(1)}
98+
certDER, err := x509.CreateCertificate(rand.Reader, &template, &template, &key.PublicKey, key)
99+
if err != nil {
100+
panic(err)
101+
}
102+
keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(key)})
103+
certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certDER})
104+
105+
tlsCert, err := tls.X509KeyPair(certPEM, keyPEM)
106+
if err != nil {
107+
panic(err)
108+
}
109+
return &tls.Config{
110+
Certificates: []tls.Certificate{tlsCert},
111+
NextProtos: []string{"h3"},
112+
}
113+
}

go.mod

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ require (
1010
github.com/quic-go/qpack v0.4.0
1111
github.com/refraction-networking/utls v1.6.6
1212
go.uber.org/mock v0.4.0
13-
golang.org/x/crypto v0.22.0
13+
golang.org/x/crypto v0.28.0
1414
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f
15-
golang.org/x/net v0.24.0
16-
golang.org/x/sync v0.7.0
17-
golang.org/x/sys v0.19.0
15+
golang.org/x/net v0.30.0
16+
golang.org/x/sync v0.8.0
17+
golang.org/x/sys v0.26.0
1818
golang.org/x/time v0.5.0
1919
)
2020

@@ -28,9 +28,12 @@ require (
2828
github.com/google/gopacket v1.1.19 // indirect
2929
github.com/google/pprof v0.0.0-20240430035430-e4905b036c4e // indirect
3030
github.com/klauspost/compress v1.17.8 // indirect
31+
github.com/pion/dtls/v3 v3.0.4 // indirect
32+
github.com/pion/logging v0.2.2 // indirect
33+
github.com/pion/transport/v3 v3.0.7 // indirect
3134
golang.org/x/mod v0.17.0 // indirect
32-
golang.org/x/text v0.14.0 // indirect
33-
golang.org/x/tools v0.20.0 // indirect
35+
golang.org/x/text v0.19.0 // indirect
36+
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
3437
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
3538
gopkg.in/yaml.v3 v3.0.1 // indirect
3639
)

go.sum

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/
8686
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
8787
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
8888
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
89+
github.com/pion/dtls/v3 v3.0.4 h1:44CZekewMzfrn9pmGrj5BNnTMDCFwr+6sLH+cCuLM7U=
90+
github.com/pion/dtls/v3 v3.0.4/go.mod h1:R373CsjxWqNPf6MEkfdy3aSe9niZvL/JaKlGeFphtMg=
91+
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
92+
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
93+
github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0=
94+
github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo=
8995
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
9096
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
9197
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -140,6 +146,8 @@ golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACk
140146
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
141147
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
142148
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
149+
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
150+
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
143151
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
144152
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY=
145153
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI=
@@ -162,6 +170,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
162170
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
163171
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
164172
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
173+
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
174+
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
165175
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
166176
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
167177
golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -174,6 +184,7 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ
174184
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
175185
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
176186
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
187+
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
177188
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
178189
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
179190
golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -182,10 +193,14 @@ golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7w
182193
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
183194
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
184195
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
196+
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
197+
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
185198
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
186199
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
187200
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
188201
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
202+
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
203+
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
189204
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
190205
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
191206
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
@@ -197,6 +212,8 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
197212
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
198213
golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY=
199214
golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
215+
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
216+
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
200217
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
201218
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
202219
google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=

0 commit comments

Comments
 (0)