From 15d6ae31367740e7fde579c186351d0665da07de Mon Sep 17 00:00:00 2001 From: clowwindy Date: Thu, 1 Nov 2012 18:00:19 +0800 Subject: [PATCH] implement server --- src/local/local.go | 2 +- src/server/server.go | 122 +++++++++++++++++++++++++++++++++++ src/shadowsocks/encrypt.go | 0 src/shadowsocks/mergesort.go | 0 src/shadowsocks/pipe.go | 0 src/test/test.go | 0 6 files changed, 123 insertions(+), 1 deletion(-) mode change 100755 => 100644 src/local/local.go create mode 100644 src/server/server.go mode change 100755 => 100644 src/shadowsocks/encrypt.go mode change 100755 => 100644 src/shadowsocks/mergesort.go mode change 100755 => 100644 src/shadowsocks/pipe.go mode change 100755 => 100644 src/test/test.go diff --git a/src/local/local.go b/src/local/local.go old mode 100755 new mode 100644 index fc5d4a8..b4bb47e --- a/src/local/local.go +++ b/src/local/local.go @@ -48,7 +48,7 @@ func handleConnection(conn net.Conn, encryptTable, decryptTable []byte, server s break } log.Println("connecting ", addr) - conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) + conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x43}) var remote net.Conn remote, err = net.Dial("tcp", server) if err != nil { diff --git a/src/server/server.go b/src/server/server.go new file mode 100644 index 0000000..4ad9384 --- /dev/null +++ b/src/server/server.go @@ -0,0 +1,122 @@ +package main + +import ( + "shadowsocks" + "net" + "bytes" + "log" + "encoding/binary" + "fmt" +) + +func handleConnection(conn net.Conn, encryptTable, decryptTable []byte) { + log.Printf("socks connect from %s\n", conn.RemoteAddr().String()) + var err error = nil + var hasError = false + for { + var _ int + buf := make([]byte, 1) + _, err = conn.Read(buf) + if err != nil { + hasError = true + break + } + buf = shadowsocks.Encrypt(decryptTable, buf) + addrType := buf[0] + var addr string + var port int16 + if addrType == 1 { + buf = make([]byte, 6) + _, err = conn.Read(buf) + if err != nil { + hasError = true + break + } + buf = shadowsocks.Encrypt(decryptTable, buf) + var addrIp net.IP = make(net.IP, 4) + copy(addrIp, buf[0:4]) + addr = addrIp.String() + sb := bytes.NewBuffer(buf[4:6]) + binary.Read(sb, binary.BigEndian, &port) + } else if addrType == 3 { + _, err = conn.Read(buf) + if err != nil { + hasError = true + break + } + buf = shadowsocks.Encrypt(decryptTable, buf) + addrLen := buf[0] + buf = make([]byte, addrLen + 2) + _, err = conn.Read(buf) + if err != nil { + hasError = true + break + } + buf = shadowsocks.Encrypt(decryptTable, buf) + sb := bytes.NewBuffer(buf[0:addrLen]) + addr = sb.String() + sb = bytes.NewBuffer(buf[addrLen:addrLen + 2]) + binary.Read(sb, binary.BigEndian, &port) + } else { + hasError = true + log.Println("unsurpported addr type") + break + } + log.Println("connecting ", addr) + var remote net.Conn + remote, err = net.Dial("tcp", fmt.Sprintf("%s:%d", addr, port)) + if err != nil { + hasError = true + break + } + if err != nil { + hasError = true + break + } + c := make(chan int, 2) + go shadowsocks.Pipe(conn, remote, decryptTable, c) + go shadowsocks.Pipe(remote, conn, encryptTable, c) + <-c // close the other connection whenever one connection is closed + log.Println("closing") + err = conn.Close() + err1 := remote.Close() + if err == nil { + err = err1 + } + break + } + if err != nil || hasError { + if err != nil { + log.Println("error ", err) + } + err = conn.Close() + if err != nil { + log.Println("close:", err) + } + return + } + +} + +func run(encryptTable, decryptTable []byte, port int) { + ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) + if err != nil { + log.Println(err) + return + } + log.Printf("starting server at port %d ...\n", port) + for { + conn, err := ln.Accept() + if err != nil { + log.Println("accept:", err) + continue + } + go handleConnection(net.Conn(conn), encryptTable, decryptTable) + } +} + +func main() { + encyrptTable, decryptTable := shadowsocks.GetTable("foobar!") + run(encyrptTable, decryptTable, 8388) + +} diff --git a/src/shadowsocks/encrypt.go b/src/shadowsocks/encrypt.go old mode 100755 new mode 100644 diff --git a/src/shadowsocks/mergesort.go b/src/shadowsocks/mergesort.go old mode 100755 new mode 100644 diff --git a/src/shadowsocks/pipe.go b/src/shadowsocks/pipe.go old mode 100755 new mode 100644 diff --git a/src/test/test.go b/src/test/test.go old mode 100755 new mode 100644