#200 support utp and rudp

This commit is contained in:
smallnest
2018-02-21 12:16:54 +08:00
parent 528790c627
commit 3a5c66163b
9 changed files with 98 additions and 23 deletions

View File

@@ -52,7 +52,7 @@ build:
go build ./...
build-all:
go build -tags "reuseport kcp quic zookeeper etcd consul ping" ./...
go build -tags "reuseport kcp quic zookeeper etcd consul ping utp rudp" ./...
test:
go test -race -tags "reuseport kcp quic zookeeper etcd consul ping" ./...
go test -tags "reuseport kcp quic zookeeper etcd consul ping utp rudp" ./...

View File

@@ -34,6 +34,8 @@ func (t *PBArith) Mul(ctx context.Context, args *testutils.ProtoArgs, reply *tes
}
func TestClient_IT(t *testing.T) {
server.UsePool = false
s := server.NewServer()
s.RegisterName("Arith", new(Arith), "")
s.RegisterName("PBArith", new(PBArith), "")

View File

@@ -13,6 +13,10 @@ import (
"github.com/smallnest/rpcx/share"
)
type makeConnFn func(c *Client, network, address string) (net.Conn, error)
var makeConnMap = make(map[string]makeConnFn)
// Connect connects the server via specified network.
func (c *Client) Connect(network, address string) error {
var conn net.Conn
@@ -28,7 +32,12 @@ func (c *Client) Connect(network, address string) error {
case "unix":
conn, err = newDirectConn(c, network, address)
default:
conn, err = newDirectConn(c, network, address)
fn := makeConnMap[network]
if fn != nil {
conn, err = fn(c, network, address)
} else {
conn, err = newDirectConn(c, network, address)
}
}
if err == nil && conn != nil {

View File

@@ -9,14 +9,5 @@ import (
)
func newDirectKCPConn(c *Client, network, address string) (net.Conn, error) {
var conn net.Conn
var err error
conn, err = kcp.DialWithOptions(address, c.option.Block.(kcp.BlockCrypt), 10, 3)
if err != nil {
return nil, err
}
return conn, nil
return kcp.DialWithOptions(address, c.option.Block.(kcp.BlockCrypt), 10, 3)
}

View File

@@ -10,19 +10,10 @@ import (
)
func newDirectQuicConn(c *Client, network, address string) (net.Conn, error) {
var conn net.Conn
var err error
tlsConf := c.option.TLSConfig
if tlsConf == nil {
tlsConf = &tls.Config{InsecureSkipVerify: true}
}
conn, err = quicconn.Dial(address, tlsConf)
if err != nil {
return nil, err
}
return conn, nil
return quicconn.Dial(address, tlsConf)
}

21
client/connection_rudp.go Normal file
View File

@@ -0,0 +1,21 @@
// +build rudp
package client
import (
"net"
)
func init() {
makeConnMap["rudp"] = newDirectRUDPConn
}
func newDirectRUDPConn(c *Client, network, address string) (net.Conn, error) {
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
return nil, err
}
laddr := net.UDPAddr{IP: net.IPv4zero, Port: 0}
return net.DialUDP("udp", &laddr, addr)
}

17
client/connection_utp.go Normal file
View File

@@ -0,0 +1,17 @@
// +build utp
package client
import (
"net"
"github.com/anacrolix/utp"
)
func init() {
makeConnMap["utp"] = newDirectUTPConn
}
func newDirectUTPConn(c *Client, network, address string) (net.Conn, error) {
return utp.Dial(address)
}

27
server/rudp.go Normal file
View File

@@ -0,0 +1,27 @@
// +build rudp
package server
import (
"net"
"github.com/u35s/rudp"
)
func init() {
makeListeners["rudp"] = rudpMakeListener
}
func rudpMakeListener(s *Server, address string) (ln net.Listener, err error) {
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
return nil, err
}
l, err := net.ListenUDP("udp", addr)
if err != nil {
return nil, err
}
return rudp.NewListener(l), nil
}

17
server/utp.go Normal file
View File

@@ -0,0 +1,17 @@
// +build utp
package server
import (
"net"
"github.com/anacrolix/utp"
)
func init() {
makeListeners["utp"] = utpMakeListener
}
func utpMakeListener(s *Server, address string) (ln net.Listener, err error) {
return utp.Listen(address)
}