From 28fffd0f9ae653bb447e6471f7d73c2ba20de50f Mon Sep 17 00:00:00 2001 From: "rui.zheng" Date: Fri, 27 Mar 2015 17:37:36 +0800 Subject: [PATCH] add server --- client.go | 44 -------------------------------------------- conn.go | 19 +++++++++++++++++++ examples/server.go | 2 +- server.go | 6 +++--- socks5.go | 31 ++++++++++++++++++------------- 5 files changed, 41 insertions(+), 61 deletions(-) delete mode 100644 client.go create mode 100644 conn.go diff --git a/client.go b/client.go deleted file mode 100644 index 6e355b7..0000000 --- a/client.go +++ /dev/null @@ -1,44 +0,0 @@ -package gosocks5 - -import ( - "io" - "net" -) - -type Client struct { - Methods []uint8 - Conn net.Conn -} - -func (c *Client) Handshake() (method uint8, err error) { - nm := len(c.Methods) - if nm == 0 { - nm = 1 - } - b := make([]byte, 2+nm) - - if _, err = c.Conn.Write([]byte{Ver5, 1, 0}); err != nil { - return - } - - if _, err = io.ReadFull(c.Conn, b[:2]); err != nil { - return - } - - method = b[1] - - if b[0] != Ver5 { - err = ErrBadVersion - return - } - - return -} - -func (c *Client) Request(r *Request) (*Reply, error) { - if err := r.Write(c.Conn); err != nil { - return nil, err - } - - return ReadReply(c.Conn) -} diff --git a/conn.go b/conn.go new file mode 100644 index 0000000..62c15ac --- /dev/null +++ b/conn.go @@ -0,0 +1,19 @@ +package gosocks5 + +import ( + //"io" + "net" +) + +type Conn struct { + net.Conn +} + +func Dial(addr string) (*Conn, error) { + conn, err := net.Dial("tcp", addr) + if err != nil { + return nil, err + } + + return &Conn{Conn: conn}, nil +} diff --git a/examples/server.go b/examples/server.go index ade88dd..5b76aef 100644 --- a/examples/server.go +++ b/examples/server.go @@ -15,7 +15,7 @@ func main() { Handle: handle, } - server.Serve() + server.ListenAndServe() } func handle(conn net.Conn, method uint8) error { diff --git a/server.go b/server.go index e0654de..61fcbf3 100644 --- a/server.go +++ b/server.go @@ -9,10 +9,10 @@ type Server struct { Addr string // TCP address to listen on SelectMethod func(methods ...uint8) uint8 - Handle func(conn net.Conn, method uint8) error + Handle func(conn net.Conn, method uint8) } -func (s *Server) Serve() error { +func (s *Server) ListenAndServe() error { addr, err := net.ResolveTCPAddr("tcp", s.Addr) if err != nil { return err @@ -30,7 +30,7 @@ func (s *Server) Serve() error { log.Println("accept:", err) continue } - //log.Println("accept", conn.RemoteAddr().String()) + //log.Println("accept", conn.RemoteAddr()) go s.handle(conn) } } diff --git a/socks5.go b/socks5.go index 2851db7..17960da 100644 --- a/socks5.go +++ b/socks5.go @@ -92,13 +92,18 @@ func ReadMethods(r io.Reader) ([]uint8, error) { return b[2:length], nil } -type Address struct { +func WriteMethod(method uint8, w io.Writer) error { + _, err := w.Write([]byte{Ver5, method}) + return err +} + +type Addr struct { Type uint8 Host string Port uint16 } -func (addr *Address) Decode(b []byte) error { +func (addr *Addr) Decode(b []byte) error { addr.Type = b[0] pos := 1 switch addr.Type { @@ -122,7 +127,7 @@ func (addr *Address) Decode(b []byte) error { return nil } -func (addr *Address) Encode(b []byte) (int, error) { +func (addr *Addr) Encode(b []byte) (int, error) { b[0] = addr.Type pos := 1 switch addr.Type { @@ -144,7 +149,7 @@ func (addr *Address) Encode(b []byte) (int, error) { return pos, nil } -func (addr *Address) String() string { +func (addr *Addr) String() string { return net.JoinHostPort(addr.Host, strconv.Itoa(int(addr.Port))) } @@ -158,10 +163,10 @@ The SOCKSv5 request */ type Request struct { Cmd uint8 - Addr *Address + Addr *Addr } -func NewRequest(cmd uint8, addr *Address) *Request { +func NewRequest(cmd uint8, addr *Addr) *Request { return &Request{ Cmd: cmd, Addr: addr, @@ -201,7 +206,7 @@ func ReadRequest(r io.Reader) (*Request, error) { return nil, err } } - addr := new(Address) + addr := new(Addr) if err := addr.Decode(b[3:length]); err != nil { return nil, err } @@ -237,10 +242,10 @@ The SOCKSv5 reply */ type Reply struct { Rep uint8 - Addr *Address + Addr *Addr } -func NewReply(rep uint8, addr *Address) *Reply { +func NewReply(rep uint8, addr *Addr) *Reply { return &Reply{ Rep: rep, Addr: addr, @@ -281,7 +286,7 @@ func ReadReply(r io.Reader) (*Reply, error) { } } - addr := new(Address) + addr := new(Addr) if err := addr.Decode(b[3:length]); err != nil { return nil, err } @@ -319,10 +324,10 @@ UDP request type UDPHeader struct { Rsv uint16 Frag uint8 - Addr *Address + Addr *Addr } -func NewUDPHeader(rsv uint16, frag uint8, addr *Address) *UDPHeader { +func NewUDPHeader(rsv uint16, frag uint8, addr *Addr) *UDPHeader { return &UDPHeader{ Rsv: rsv, Frag: frag, @@ -375,7 +380,7 @@ func ReadUDPDatagram(r io.Reader) (*UDPDatagram, error) { n = hlen + dlen } - header.Addr = new(Address) + header.Addr = new(Addr) if err := header.Addr.Decode(b[3:hlen]); err != nil { return nil, err }