diff --git a/example/client.go b/example/client.go new file mode 100644 index 000000000..f52fbe2c4 --- /dev/null +++ b/example/client.go @@ -0,0 +1,69 @@ +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) + } +}