diff --git a/conf/conf.go b/conf/conf.go index 1ca0f97..20c02f0 100644 --- a/conf/conf.go +++ b/conf/conf.go @@ -34,7 +34,7 @@ var Conf = struct { func init() { flag.StringVar(&Conf.ConfigFile, "f", "", "config file location") - flag.StringVar(&Conf.NetType, "n", "QUIC", "proxy net type (QUIC|KCP)") + flag.StringVar(&Conf.NetType, "n", "QUIC", "proxy net type (QUIC|KCP|TCP)") flag.StringVar(&Conf.Password, "p", "12345678", "password") flag.StringVar(&Conf.ServerPort, "P", "5533", "server mode listen port") flag.StringVar(&Conf.ServerAddr, "s", "", "server IP (run in client mode if set)") diff --git a/parse/addr.go b/parse/addr.go index 02ed7c4..00cf461 100644 --- a/parse/addr.go +++ b/parse/addr.go @@ -1,4 +1,4 @@ -package parser +package parse import ( "bufio" diff --git a/parse/sni.go b/parse/sni.go index aa665d1..ea76053 100644 --- a/parse/sni.go +++ b/parse/sni.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package parser +package parse import ( "encoding/binary" diff --git a/parse/tee_conn.go b/parse/tee_conn.go index 518899e..f5b5b0c 100644 --- a/parse/tee_conn.go +++ b/parse/tee_conn.go @@ -1,4 +1,4 @@ -package parser +package parse import "net" diff --git a/proxy/client.go b/proxy/client.go index 7aefd46..e3f0902 100644 --- a/proxy/client.go +++ b/proxy/client.go @@ -6,6 +6,7 @@ import ( "github.com/golang/glog" "github.com/wweir/sower/proxy/kcp" "github.com/wweir/sower/proxy/quic" + "github.com/wweir/sower/proxy/tcp" ) type Client interface { @@ -20,6 +21,8 @@ func StartClient(netType, server, password string) { client = quic.NewClient() case KCP.String(): client = kcp.NewClient(password) + case TCP.String(): + client = tcp.NewClient() } for { diff --git a/proxy/server.go b/proxy/server.go index 34ce5f2..124fc10 100644 --- a/proxy/server.go +++ b/proxy/server.go @@ -8,19 +8,22 @@ import ( "github.com/wweir/sower/parse" "github.com/wweir/sower/proxy/kcp" "github.com/wweir/sower/proxy/quic" + "github.com/wweir/sower/proxy/tcp" ) type Server interface { Listen(port string) (<-chan net.Conn, error) } -func StartServer(netType, port,password string) { +func StartServer(netType, port, password string) { var server Server switch netType { case QUIC.String(): server = quic.NewServer() case KCP.String(): server = kcp.NewServer(password) + case TCP.String(): + server = tcp.NewServer() } if port == "" { @@ -43,7 +46,7 @@ func StartServer(netType, port,password string) { func handle(conn net.Conn) { defer conn.Close() - conn, addr, err := parser.ParseAddr(conn) + conn, addr, err := parse.ParseAddr(conn) if err != nil { glog.Warningln(err) return diff --git a/proxy/tcp/client.go b/proxy/tcp/client.go new file mode 100644 index 0000000..6231576 --- /dev/null +++ b/proxy/tcp/client.go @@ -0,0 +1,14 @@ +package tcp + +import "net" + +type client struct { +} + +func NewClient() *client { + return &client{} +} + +func (c *client) Dial(server string) (net.Conn, error) { + return net.Dial("tcp", server) +} diff --git a/proxy/tcp/server.go b/proxy/tcp/server.go new file mode 100644 index 0000000..b5d2b65 --- /dev/null +++ b/proxy/tcp/server.go @@ -0,0 +1,35 @@ +package tcp + +import ( + "net" + + "github.com/golang/glog" +) + +type server struct { +} + +func NewServer() *server { + return &server{} +} + +func (s *server) Listen(port string) (<-chan net.Conn, error) { + ln, err := net.Listen("tcp", port) + if err != nil { + return nil, err + } + + connCh := make(chan net.Conn) + go func() { + for { + conn, err := ln.Accept() + if err != nil { + glog.Errorln(err) + continue + } + + connCh <- conn + } + }() + return connCh, nil +} diff --git a/proxy/util.go b/proxy/util.go index 4087785..c1b16f1 100644 --- a/proxy/util.go +++ b/proxy/util.go @@ -16,6 +16,7 @@ type netType int const ( QUIC netType = iota KCP + TCP ) func relay(conn1, conn2 net.Conn) {