testing/udp-punch/handshakee.go

85 lines
2.1 KiB
Go

package main
import (
"fmt"
"log"
"net"
"strings"
"time"
)
func handshakee(handshakerAddress, localAddress string, name, target string) {
// Get our address as a usable UDPAddr.
remoteAddr, _ := net.ResolveUDPAddr("udp", handshakerAddress)
// Get a random local port.
localAddr, _ := net.ResolveUDPAddr("udp", localAddress)
log.Printf("Attempting to listen on %s\n", localAddr.String())
// Start listening!
localConn, err := net.ListenUDP("udp", localAddr)
if err != nil {
log.Fatal(err)
}
go func() {
log.Println("Sending REG")
_, err := localConn.WriteTo([]byte(fmt.Sprintf("REG %s", name)), remoteAddr)
if err != nil {
panic(err)
}
if target != "" {
log.Printf("Sending AWAIT for %s\n", target)
_, err := localConn.WriteTo([]byte(fmt.Sprintf("AWAIT %s", target)), remoteAddr)
if err != nil {
panic(err)
}
}
}()
listen(localConn, name)
}
func listen(conn *net.UDPConn, name string) {
log.Printf("Listening on %s\n", conn.LocalAddr().String())
for {
buffer := make([]byte, 1024)
bytesRead, fromAddr, err := conn.ReadFromUDP(buffer)
if err != nil {
fmt.Println("[ERROR]", err)
continue
}
msg := string(buffer[0:bytesRead])
parts := strings.Split(msg, " ")
if parts[0] == "ARRIVED" {
log.Printf("recv ARRIVED for %s\n", parts[1])
otherAddr, _ := net.ResolveUDPAddr("udp", parts[1])
conn.WriteTo([]byte(fmt.Sprintf("HELLO %s", name)), otherAddr)
go chatWith(conn, name, parts[1])
} else if parts[0] == "HELLO" {
log.Printf("recv HELLO from %s\n", fromAddr.String())
go chatWith(conn, name, fromAddr.String())
} else {
fmt.Printf("Unhandled: %+v\n", parts)
}
}
}
func chatWith(conn *net.UDPConn, name string, otherClient string) {
log.Printf("Beginning chat with %s\n", otherClient)
otherAddr, _ := net.ResolveUDPAddr("udp", otherClient)
for {
log.Println("Sending hello...")
bytesWritten, err := conn.WriteTo([]byte(fmt.Sprintf("Hello from %s", name)), otherAddr)
if err != nil {
log.Printf("err: %s\n", err)
} else {
log.Printf("... wrote %d bytes.\n", bytesWritten)
}
time.Sleep(5 * time.Second)
}
}