fix udp transfer

This commit is contained in:
rui.zheng 2015-03-25 15:50:25 +08:00
parent 4056db5979
commit c09984ada1

64
gost.go
View File

@ -68,7 +68,7 @@ func (g *Gost) handle(conn net.Conn) {
} }
func (g *Gost) cli(conn net.Conn) { func (g *Gost) cli(conn net.Conn) {
lg := NewLog(true) lg := NewLog(false)
defer func() { defer func() {
lg.Logln() lg.Logln()
lg.Flush() lg.Flush()
@ -233,7 +233,7 @@ func (g *Gost) srv(conn net.Conn) {
} }
lg.Logln("|<<<", cmd) lg.Logln("|<<<", cmd)
tunnelUdp(conn, uconn) tunnelUdp(conn, uconn, true)
/* /*
up, err := ReadUdpPayload(uconn) up, err := ReadUdpPayload(uconn)
if err != nil { if err != nil {
@ -336,9 +336,10 @@ func (g *Gost) srv(conn net.Conn) {
} }
} }
func tunnelUdp(conn net.Conn, uconn *net.UDPConn) (err error) { func tunnelUdp(conn net.Conn, uconn *net.UDPConn, rawUdp bool) (err error) {
rChan := make(chan error, 1) rChan := make(chan error, 1)
wChan := make(chan error, 1) wChan := make(chan error, 1)
var raddr net.Addr
go func() { go func() {
for { for {
@ -347,28 +348,41 @@ func tunnelUdp(conn net.Conn, uconn *net.UDPConn) (err error) {
rChan <- err rChan <- err
return return
} }
log.Println("r", up)
addr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(up.Addr, strconv.Itoa(int(up.Port)))) addr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(up.Addr, strconv.Itoa(int(up.Port))))
if err != nil { if err != nil {
rChan <- err rChan <- err
return return
} }
if rawUdp {
if _, err = uconn.WriteTo(up.Data, addr); err != nil { if _, err = uconn.WriteTo(up.Data, addr); err != nil {
rChan <- err rChan <- err
return return
} }
} else {
up.Rsv = 0
buf := &bytes.Buffer{}
up.Write(buf)
if _, err := uconn.WriteTo(buf.Bytes(), raddr); err != nil {
rChan <- err
return
}
}
} }
}() }()
go func() { go func() {
b := make([]byte, 65535)
for { for {
b := make([]byte, 65797)
n, addr, err := uconn.ReadFrom(b) n, addr, err := uconn.ReadFrom(b)
if err != nil { if err != nil {
wChan <- err wChan <- err
return return
} }
raddr = addr
if rawUdp {
host, port, _ := net.SplitHostPort(addr.String()) host, port, _ := net.SplitHostPort(addr.String())
p, _ := strconv.Atoi(port) p, _ := strconv.Atoi(port)
up := NewUdpPayload(uint16(n), AddrIPv4, host, uint16(p), b[:n]) up := NewUdpPayload(uint16(n), AddrIPv4, host, uint16(p), b[:n])
@ -376,6 +390,22 @@ func tunnelUdp(conn net.Conn, uconn *net.UDPConn) (err error) {
wChan <- err wChan <- err
return return
} }
log.Println("w", up)
continue
}
rbuf := bytes.NewReader(b)
up, err := ReadUdpPayload(rbuf)
if err != nil {
wChan <- err
return
}
up.Rsv = uint16(len(up.Data))
if err := up.Write(conn); err != nil {
wChan <- err
return
}
log.Println("w", up)
} }
}() }()
@ -419,7 +449,7 @@ func socks5Transfer(conn, sconn net.Conn, lg *BufferedLog) {
lg.Logln("|<<<", cmd) lg.Logln("|<<<", cmd)
if err := Transport(conn, sconn); err != nil { if err := Transport(conn, sconn); err != nil {
lg.Logln(err) lg.Logln("transport:", err)
} }
case CmdUdp: case CmdUdp:
//raddr := conn.(*net.TCPConn).RemoteAddr() //raddr := conn.(*net.TCPConn).RemoteAddr()
@ -445,17 +475,17 @@ func socks5Transfer(conn, sconn net.Conn, lg *BufferedLog) {
} }
lg.Logln("<<<|", cmd) lg.Logln("<<<|", cmd)
host, port, _ := net.SplitHostPort(uconn.LocalAddr().String()) _, port, _ := net.SplitHostPort(uconn.LocalAddr().String())
p, _ := strconv.Atoi(port) p, _ := strconv.Atoi(port)
cmd = NewCmd(CmdUdp, AddrIPv4, host, uint16(p)) cmd = NewCmd(Succeeded, AddrIPv4, "", uint16(p))
if err = cmd.Write(conn); err != nil { if err = cmd.Write(conn); err != nil {
lg.Logln(err) lg.Logln(err)
return return
} }
lg.Logln("|<<<", cmd) lg.Logln("|<<<", cmd)
if err := tunnelUdp(sconn, uconn); err != nil { if err := tunnelUdp(sconn, uconn, false); err != nil {
lg.Logln(err) lg.Logln("tunnel UDP:", err)
} }
case CmdBind: case CmdBind:
if err := cmd.Write(sconn); err != nil { if err := cmd.Write(sconn); err != nil {
@ -463,8 +493,20 @@ func socks5Transfer(conn, sconn net.Conn, lg *BufferedLog) {
return return
} }
if err := Transport(conn, sconn); err != nil { cmd, err := ReadCmd(sconn)
if err != nil {
lg.Logln(err) lg.Logln(err)
return
}
lg.Logln("<<<|", cmd)
if err := cmd.Write(conn); err != nil {
lg.Logln(err)
return
}
lg.Logln("|<<<", cmd)
if err := Transport(conn, sconn); err != nil {
lg.Logln("bind:", err)
} }
} }