提交 73bd91a2 作者: Jeromy 提交者: Juan Batiz-Benet

implement listening on swarm object

上级 bc2618df
......@@ -3,7 +3,10 @@ package swarm
import (
"fmt"
peer "github.com/jbenet/go-ipfs/peer"
ma "github.com/jbenet/go-multiaddr"
u "github.com/jbenet/go-ipfs/util"
"sync"
"net"
)
// Message represents a packet of information sent to or received from a
......@@ -42,19 +45,64 @@ type Swarm struct {
Chan *Chan
conns ConnMap
connsLock sync.RWMutex
local *peer.Peer
}
// NewSwarm constructs a Swarm, with a Chan.
func NewSwarm() *Swarm {
func NewSwarm(local *peer.Peer) *Swarm {
s := &Swarm{
Chan: NewChan(10),
conns: ConnMap{},
local: local,
}
go s.fanOut()
return s
}
// Close closes a swam.
// Open listeners for each network the swarm should listen on
func (s *Swarm) Listen() {
for _,addr := range s.local.Addresses {
err := s.connListen(addr)
if err != nil {
u.PErr("Failed to listen on: %s [%s]", addr, err)
}
}
}
// Listen for new connections on the given multiaddr
func (s *Swarm) connListen(maddr *ma.Multiaddr) error {
netstr, addr, err := maddr.DialArgs()
if err != nil {
return err
}
list, err := net.Listen(netstr, addr)
if err != nil {
return err
}
// Accept and handle new connections on this listener until it errors
go func() {
for {
nconn,err := list.Accept()
if err != nil {
u.PErr("Failed to accept connection: %s - %s", netstr, addr)
return
}
go s.handleNewConn(nconn)
}
}()
return nil
}
// Handle getting ID from this peer and adding it into the map
func (s *Swarm) handleNewConn(nconn net.Conn) {
panic("Not yet implemented!")
}
// Close closes a swarm.
func (s *Swarm) Close() {
s.connsLock.RLock()
l := len(s.conns)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论