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) } }