Skip to content

Instantly share code, notes, and snippets.

@bamchoh
Created June 23, 2020 16:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bamchoh/41b37da2efb2b0f41dfa4440f1b38f2d to your computer and use it in GitHub Desktop.
Save bamchoh/41b37da2efb2b0f41dfa4440f1b38f2d to your computer and use it in GitHub Desktop.
NAT超え over UDP
package main
import (
"flag"
"fmt"
"net"
"strings"
"time"
)
var addr = flag.String("addr", "", "")
func write(dst, src string) (raddr, laddr []byte, err error) {
var udpaddr *net.UDPAddr
udpaddr, err = net.ResolveUDPAddr("udp4", dst)
if err != nil {
return
}
var udpladdr *net.UDPAddr
if src != "" {
udpladdr, err = net.ResolveUDPAddr("udp4", src)
if err != nil {
return
}
}
var conn *net.UDPConn
conn, err = net.DialUDP("udp4", udpladdr, udpaddr)
if err != nil {
return
}
defer conn.Close()
fmt.Println("Remote Addr:", conn.RemoteAddr().String())
fmt.Println("Local Addr:", conn.LocalAddr().String())
for {
_, err = conn.Write([]byte(fmt.Sprintf("%v", time.Now())))
if err != nil {
return
}
rxbuf := make([]byte, 65535)
var n int
var ip net.Addr
n, ip, err = conn.ReadFrom(rxbuf)
if err != nil {
return
}
fmt.Println(ip.String(), "received:", string(rxbuf[:n]))
if strings.HasPrefix(string(rxbuf[:n]), "addr:") {
raddr = rxbuf[5:n]
laddr = []byte(conn.LocalAddr().String())
return
}
}
}
func main() {
flag.Parse()
dstAddr, srcAddr, err := write(*addr, "")
if err != nil {
panic(err)
}
msg, _, err := write(string(dstAddr), string(srcAddr))
if err != nil {
panic(err)
}
fmt.Println(string(msg))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment