add server

This commit is contained in:
rui.zheng
2015-03-27 17:37:36 +08:00
parent 3da0477d17
commit 28fffd0f9a
5 changed files with 41 additions and 61 deletions
-44
View File
@@ -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)
}
+19
View File
@@ -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
}
+1 -1
View File
@@ -15,7 +15,7 @@ func main() {
Handle: handle,
}
server.Serve()
server.ListenAndServe()
}
func handle(conn net.Conn, method uint8) error {
+3 -3
View File
@@ -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)
}
}
+18 -13
View File
@@ -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
}