forked from quic-go/quic-go
70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"math/rand"
|
|
"net"
|
|
"time"
|
|
|
|
quic "github.com/lucas-clemente/quic-go"
|
|
"github.com/lucas-clemente/quic-go/crypto"
|
|
"github.com/lucas-clemente/quic-go/protocol"
|
|
)
|
|
|
|
func main() {
|
|
addr := "quic.clemente.io:6121"
|
|
|
|
udpAddr, err := net.ResolveUDPAddr("udp", addr)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
fmt.Println(udpAddr.String())
|
|
|
|
conn, err := net.DialUDP("udp", nil, udpAddr)
|
|
defer conn.Close()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
rand.Seed(time.Now().UTC().UnixNano())
|
|
connectionID := protocol.ConnectionID(0x1337 + rand.Int63())
|
|
packetNumber := protocol.PacketNumber(1)
|
|
|
|
ph := quic.PublicHeader{
|
|
ConnectionID: connectionID,
|
|
PacketNumber: packetNumber,
|
|
PacketNumberLen: protocol.PacketNumberLen2,
|
|
VersionFlag: true,
|
|
VersionNumber: protocol.Version34,
|
|
}
|
|
|
|
raw := make([]byte, 0, protocol.MaxPacketSize)
|
|
buffer := bytes.NewBuffer(raw)
|
|
|
|
err = ph.Write(buffer, protocol.Version34, protocol.PerspectiveClient)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
payloadStartIndex := buffer.Len()
|
|
|
|
raw = raw[0:buffer.Len()]
|
|
aead := crypto.NullAEAD{}
|
|
aead.Seal(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], packetNumber, raw[:payloadStartIndex])
|
|
raw = raw[0 : buffer.Len()+12]
|
|
|
|
conn.Write(raw)
|
|
|
|
for {
|
|
data := make([]byte, 1500)
|
|
n, _, err := conn.ReadFromUDP(data)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
data = data[:n]
|
|
fmt.Printf("Response length: %d\n", n)
|
|
fmt.Println(data)
|
|
}
|
|
}
|