2016-05-30 18:21:41 -04:00
|
|
|
package hub
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"net"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
v2net "github.com/v2ray/v2ray-core/common/net"
|
2016-06-01 19:49:25 -04:00
|
|
|
"github.com/v2ray/v2ray-core/transport"
|
2016-05-30 18:21:41 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
ErrorInvalidHost = errors.New("Invalid Host.")
|
|
|
|
|
|
|
|
globalCache = NewConnectionCache()
|
|
|
|
)
|
|
|
|
|
2016-06-03 18:38:22 -04:00
|
|
|
func Dial(src v2net.Address, dest v2net.Destination) (*Connection, error) {
|
|
|
|
if src == nil {
|
|
|
|
src = v2net.AnyIP
|
|
|
|
}
|
|
|
|
id := src.String() + "-" + dest.NetAddr()
|
2016-06-01 19:49:25 -04:00
|
|
|
var conn net.Conn
|
2016-06-03 18:38:22 -04:00
|
|
|
if dest.IsTCP() && transport.IsConnectionReusable() {
|
|
|
|
conn = globalCache.Get(id)
|
2016-06-01 19:49:25 -04:00
|
|
|
}
|
2016-05-30 18:21:41 -04:00
|
|
|
if conn == nil {
|
|
|
|
var err error
|
2016-06-03 18:38:22 -04:00
|
|
|
conn, err = DialWithoutCache(src, dest)
|
2016-05-30 18:21:41 -04:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return &Connection{
|
2016-06-03 18:38:22 -04:00
|
|
|
dest: id,
|
2016-05-30 18:21:41 -04:00
|
|
|
conn: conn,
|
|
|
|
listener: globalCache,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2016-06-03 18:38:22 -04:00
|
|
|
func DialWithoutCache(src v2net.Address, dest v2net.Destination) (net.Conn, error) {
|
|
|
|
dialer := &net.Dialer{
|
|
|
|
Timeout: time.Second * 60,
|
|
|
|
DualStack: true,
|
2016-05-30 18:21:41 -04:00
|
|
|
}
|
|
|
|
|
2016-06-03 18:38:22 -04:00
|
|
|
if src != nil && src != v2net.AnyIP {
|
|
|
|
var addr net.Addr
|
|
|
|
if dest.IsTCP() {
|
|
|
|
addr = &net.TCPAddr{
|
|
|
|
IP: src.IP(),
|
|
|
|
Port: 0,
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
addr = &net.UDPAddr{
|
|
|
|
IP: src.IP(),
|
|
|
|
Port: 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dialer.LocalAddr = addr
|
2016-05-30 18:21:41 -04:00
|
|
|
}
|
|
|
|
|
2016-06-03 18:38:22 -04:00
|
|
|
return dialer.Dial(dest.Network().String(), dest.NetAddr())
|
2016-05-30 18:21:41 -04:00
|
|
|
}
|