mirror of
https://github.com/ginuerzh/gosocks5.git
synced 2024-08-11 17:54:31 +00:00
add server
This commit is contained in:
@@ -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)
|
||||
}
|
||||
@@ -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
@@ -15,7 +15,7 @@ func main() {
|
||||
Handle: handle,
|
||||
}
|
||||
|
||||
server.Serve()
|
||||
server.ListenAndServe()
|
||||
}
|
||||
|
||||
func handle(conn net.Conn, method uint8) error {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user