66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"log"
|
|
"net"
|
|
"strconv"
|
|
|
|
"github.com/go-gost/gosocks5"
|
|
ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
|
|
)
|
|
|
|
func main() {
|
|
ssuClient()
|
|
}
|
|
|
|
func ssuClient() {
|
|
addr, err := net.ResolveUDPAddr("udp", ":18338")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
laddr, _ := net.ResolveUDPAddr("udp", ":10800")
|
|
conn, err := net.ListenUDP("udp", laddr)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
cp, err := ss.NewCipher("chacha20", "123456")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
cc := ss.NewSecurePacketConn(conn, cp, false)
|
|
|
|
raddr, _ := net.ResolveUDPAddr("udp", ":8080")
|
|
msg := []byte(`abcdefghijklmnopqrstuvwxyz`)
|
|
dgram := gosocks5.NewUDPDatagram(gosocks5.NewUDPHeader(0, 0, toSocksAddr(raddr)), msg)
|
|
buf := bytes.Buffer{}
|
|
dgram.Write(&buf)
|
|
for {
|
|
log.Printf("%# x", buf.Bytes()[3:])
|
|
if _, err := cc.WriteTo(buf.Bytes()[3:], addr); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
b := make([]byte, 1024)
|
|
n, adr, err := cc.ReadFrom(b)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Printf("%s: %# x", adr, b[:n])
|
|
}
|
|
}
|
|
|
|
func toSocksAddr(addr net.Addr) *gosocks5.Addr {
|
|
host := "0.0.0.0"
|
|
port := 0
|
|
if addr != nil {
|
|
h, p, _ := net.SplitHostPort(addr.String())
|
|
host = h
|
|
port, _ = strconv.Atoi(p)
|
|
}
|
|
return &gosocks5.Addr{
|
|
Type: gosocks5.AddrIPv4,
|
|
Host: host,
|
|
Port: uint16(port),
|
|
}
|
|
}
|