Skip to content

Instantly share code, notes, and snippets.

@nerdalert
Last active November 17, 2022 16:53
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 nerdalert/bf319027368ad9313a83b209959d876b to your computer and use it in GitHub Desktop.
Save nerdalert/bf319027368ad9313a83b209959d876b to your computer and use it in GitHub Desktop.

Stun Dialer

package main

import (
	"net"
	"time"

	"github.com/pion/stun"
	log "github.com/sirupsen/logrus"
)

func main() {
	request()
}

func request() {

	lAddr := &net.UDPAddr{
		Port: 51820,
	}
	d := &net.Dialer{
		Timeout:   3 * time.Second,
		LocalAddr: lAddr,
	}
	log.Infof("dialing stun server stun.l.google.com...")
	conn, err := d.Dial("udp4", "stun.l.google.com:19302")
	if err != nil {
		log.Errorf("%v", err)
		return
	}
	stunDialer(&conn)
}

func stunDialer(conn *net.Conn) {
	c, err := stun.NewClient(*conn)
	if err != nil {
		log.Errorf("%v", err)
	}
	var xorAddr stun.XORMappedAddress

	if err = c.Do(stun.MustBuild(stun.TransactionID, stun.BindingRequest), func(res stun.Event) {

		if res.Error != nil {
			log.Println(res.Error)
			return
		}
		if getErr := xorAddr.GetFrom(res.Message); getErr != nil {
			log.Println(getErr)
			if err := c.Close(); err != nil {
				log.Println(err)
				return
			}
			return
		}
		log.Infof("external address %s and port: %d", xorAddr.IP, xorAddr.Port)

	}); err != nil {
		log.Debugf("%v", err)
		return
	}
	if err := c.Close(); err != nil {
		log.Debugf("%v", err)
		return
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment