package reuseport
import (
"net"
"github.com/libp2p/go-reuseport"
ma "github.com/multiformats/go-multiaddr"
manet "github.com/multiformats/go-multiaddr/net"
)
type listener struct {
manet .Listener
network *network
}
func (l *listener ) Close () error {
l .network .mu .Lock ()
delete (l .network .listeners , l )
l .network .dialer = nil
l .network .mu .Unlock ()
return l .Listener .Close ()
}
func (t *Transport ) Listen (laddr ma .Multiaddr ) (manet .Listener , error ) {
nw , naddr , err := manet .DialArgs (laddr )
if err != nil {
return nil , err
}
var n *network
switch nw {
case "tcp4" :
n = &t .v4
case "tcp6" :
n = &t .v6
default :
return nil , ErrWrongProto
}
if !reuseport .Available () {
return manet .Listen (laddr )
}
nl , err := reuseport .Listen (nw , naddr )
if err != nil {
return manet .Listen (laddr )
}
if _ , ok := nl .Addr ().(*net .TCPAddr ); !ok {
nl .Close ()
return nil , ErrWrongProto
}
malist , err := manet .WrapNetListener (nl )
if err != nil {
nl .Close ()
return nil , err
}
list := &listener {
Listener : malist ,
network : n ,
}
n .mu .Lock ()
defer n .mu .Unlock ()
if n .listeners == nil {
n .listeners = make (map [*listener ]struct {})
}
n .listeners [list ] = struct {}{}
n .dialer = nil
return list , nil
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .