165 lines
2.9 KiB
Go
165 lines
2.9 KiB
Go
package node
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net"
|
|
"net/netip"
|
|
"runtime/debug"
|
|
)
|
|
|
|
var (
|
|
network = []byte{10, 1, 1, 0}
|
|
serverIP = byte(1)
|
|
clientIP = byte(2)
|
|
port = uint16(5151)
|
|
netName = "testnet"
|
|
)
|
|
|
|
func must(err error) {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
type TmpNode struct {
|
|
network []byte
|
|
localIP byte
|
|
peers peerRepo
|
|
port uint16
|
|
netName string
|
|
iface io.ReadWriteCloser
|
|
w *connWriter
|
|
r *connReader
|
|
}
|
|
|
|
func NewTmpNodeServer() *TmpNode {
|
|
n := &TmpNode{
|
|
localIP: serverIP,
|
|
network: network,
|
|
peers: newPeerRepo(),
|
|
port: port,
|
|
netName: netName,
|
|
}
|
|
|
|
var err error
|
|
n.iface, err = openInterface(n.network, n.localIP, n.netName)
|
|
must(err)
|
|
|
|
myAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", n.port))
|
|
must(err)
|
|
|
|
conn, err := net.ListenUDP("udp", myAddr)
|
|
must(err)
|
|
|
|
n.w = newConnWriter(conn, n.localIP, n.peers.Get)
|
|
n.r = newConnReader(conn, n.localIP, n.peers.Get)
|
|
|
|
return n
|
|
}
|
|
|
|
func NewTmpNodeClient() *TmpNode {
|
|
n := &TmpNode{
|
|
localIP: clientIP,
|
|
network: network,
|
|
peers: newPeerRepo(),
|
|
port: port,
|
|
netName: netName,
|
|
}
|
|
|
|
var err error
|
|
n.iface, err = openInterface(n.network, n.localIP, n.netName)
|
|
must(err)
|
|
|
|
myAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", n.port))
|
|
must(err)
|
|
|
|
conn, err := net.ListenUDP("udp", myAddr)
|
|
must(err)
|
|
|
|
n.w = newConnWriter(conn, n.localIP, n.peers.Get)
|
|
n.r = newConnReader(conn, n.localIP, n.peers.Get)
|
|
|
|
return n
|
|
}
|
|
|
|
func (n *TmpNode) RunServer() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
fmt.Printf("%v", r)
|
|
debug.PrintStack()
|
|
}
|
|
}()
|
|
|
|
// Get remoteAddr from a packet.
|
|
buf := make([]byte, bufferSize)
|
|
remoteAddr, h, _, err := n.r.Read(buf)
|
|
must(err)
|
|
log.Printf("Got remote addr: %d -> %v", h.SourceIP, remoteAddr)
|
|
must(err)
|
|
|
|
n.peers.Set(h.SourceIP, &peer{
|
|
IP: h.SourceIP,
|
|
Addr: &remoteAddr,
|
|
})
|
|
|
|
go n.readFromIFace()
|
|
n.readFromConn()
|
|
}
|
|
|
|
func (n *TmpNode) RunClient(srvAddrStr string) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
fmt.Printf("%v", r)
|
|
debug.PrintStack()
|
|
}
|
|
}()
|
|
|
|
serverAddr, err := netip.ParseAddrPort(fmt.Sprintf("%s:%d", srvAddrStr, port))
|
|
must(err)
|
|
|
|
log.Printf("Setting %d => %v", serverIP, serverAddr)
|
|
n.peers.Set(serverIP, &peer{
|
|
IP: serverIP,
|
|
Addr: &serverAddr,
|
|
})
|
|
|
|
must(n.w.WriteTo(serverIP, 1, []byte{1, 2, 3, 4, 5, 6, 7, 8}))
|
|
|
|
go n.readFromIFace()
|
|
n.readFromConn()
|
|
}
|
|
|
|
func (n *TmpNode) readFromIFace() {
|
|
var (
|
|
buf = make([]byte, bufferSize)
|
|
packet []byte
|
|
remoteIP byte
|
|
err error
|
|
)
|
|
|
|
for {
|
|
packet, remoteIP, err = readNextPacket(n.iface, buf)
|
|
must(err)
|
|
must(n.w.WriteTo(remoteIP, 1, packet))
|
|
}
|
|
}
|
|
|
|
func (node *TmpNode) readFromConn() {
|
|
var (
|
|
buf = make([]byte, bufferSize)
|
|
packet []byte
|
|
err error
|
|
)
|
|
|
|
for {
|
|
_, _, packet, err = node.r.Read(buf)
|
|
must(err)
|
|
// We assume that we're only receiving packets from one source.
|
|
|
|
_, err = node.iface.Write(packet)
|
|
must(err)
|
|
}
|
|
}
|