This commit is contained in:
rui.zheng 2015-03-27 18:12:25 +08:00
parent 302767f68a
commit 8d30eb1a72
2 changed files with 43 additions and 33 deletions

View File

@ -128,6 +128,7 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
if err != nil {
return
}
log.Println(req)
switch req.Cmd {
case gosocks5.CmdConnect, gosocks5.CmdBind:
@ -162,29 +163,35 @@ func handleSocks5(conn net.Conn, sconn net.Conn) {
return
}
addr.Port = req.Addr.Port
raddr, err := net.ResolveUDPAddr("udp", addr.String())
if err != nil {
return
}
cliTunnelUDP(raddr, uconn, conn)
cliTunnelUDP(uconn, conn)
}
}
func cliTunnelUDP(raddr net.Addr, uconn *net.UDPConn, conn net.Conn) {
func cliTunnelUDP(uconn *net.UDPConn, conn net.Conn) {
var raddr *net.UDPAddr
go func() {
udp, err := gosocks5.ReadUDPDatagram(uconn)
b := make([]byte, 65797)
for {
n, addr, err := uconn.ReadFromUDP(b)
if err != nil {
log.Println(err)
return
}
raddr = addr
r := bytes.NewBuffer(b[:n])
udp, err := gosocks5.ReadUDPDatagram(r)
if err != nil {
return
}
udp.Header.Rsv = uint16(len(udp.Data))
log.Println("r", raddr.String(), udp.Header)
if err := udp.Write(conn); err != nil {
log.Println(err)
return
}
}
}()
for {
@ -193,10 +200,10 @@ func cliTunnelUDP(raddr net.Addr, uconn *net.UDPConn, conn net.Conn) {
log.Println(err)
return
}
log.Println("w", udp.Header)
udp.Header.Rsv = 0
buf := &bytes.Buffer{}
udp.Write(buf)
if _, err := uconn.WriteTo(buf.Bytes(), raddr); err != nil {
log.Println(err)
return

View File

@ -115,6 +115,7 @@ func srvHandle(conn net.Conn, method uint8) {
func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) {
go func() {
b := make([]byte, 65535)
for {
n, addr, err := uconn.ReadFromUDP(b)
if err != nil {
log.Println(err)
@ -123,26 +124,28 @@ func srvTunnelUDP(conn net.Conn, uconn *net.UDPConn) {
udp := gosocks5.NewUDPDatagram(
gosocks5.NewUDPHeader(uint16(n), 0, ToSocksAddr(addr)), b[:n])
log.Println("r", udp.Header)
if err := udp.Write(conn); err != nil {
log.Println(err)
return
}
}
}()
for {
ud, err := gosocks5.ReadUDPDatagram(conn)
udp, err := gosocks5.ReadUDPDatagram(conn)
if err != nil {
log.Println(err)
return
}
addr, err := net.ResolveUDPAddr("udp", ud.Header.Addr.String())
log.Println("w", udp.Header)
addr, err := net.ResolveUDPAddr("udp", udp.Header.Addr.String())
if err != nil {
log.Println(err)
continue // drop silently
}
if _, err := uconn.WriteToUDP(ud.Data, addr); err != nil {
if _, err := uconn.WriteToUDP(udp.Data, addr); err != nil {
log.Println(err)
return
}