1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-09-11 07:03:32 +08:00
Files
kubo/netmux/interface.go
Juan Batiz-Benet 3b570d3f82 skeleton.
2014-06-26 01:14:26 -07:00

97 lines
1.5 KiB
Go

package netmux
import (
"net"
)
// An interface is the module connecting netmux
// to various networks (tcp, udp, webrtc, etc).
// It keeps the relevant connections open.
type Interface struct {
// Interface network (e.g. udp4, tcp6)
Network string
// Own network address
Address string
ResolvedAddress string
// Connection
conn *net.Conn
// next packets + close control channels
Input chan *Packet
Output chan *Packet
Closed chan bool
Errors chan error
}
func NewUDPInterface(net, addr string) (*Interface, error) {
raddr, err := net.ResolveUDPAddr(net, addr)
if err != nil {
return nil, err
}
conn, err := net.ListenUDP(net, addr)
if err != nil {
return nil, err
}
i := &Interface{
Network: net,
Address: addr,
ResolvedAddress: raddr,
conn: conn,
}
go i.processInput()
go i.processOutput()
return i, nil
}
func (i *Interface) processOutput() {
for {
select {
case <-i.Closed:
break;
case buffer := <-i.Output:
i.conn.Write([]byte(buffer))
}
}
}
func (i *Interface) processUDPInput() {
for {
select {
case <- i.Closed:
break;
}
}
}
func (i *Interface) Read(buffer []byte) bool {
n, err := i.Conn.Read(buffer)
if err != nil {
i.Errors <- err
i.Close()
return false
}
return true
}
func (i *Interface) Close() {
// closing net connection
err := i.conn.Close()
if err != nil {
i.Errors <- err
}
// closing channels
close(i.Input)
close(i.Output)
close(i.Closed)
close(i.Errors)
}