package peer import ( "io" "log" "net" "net/netip" ) type Peer struct { ip byte // Last byte of IPv4 address. hubAddr string apiKey string isServer bool isMediator bool encPubKey []byte encPrivKey []byte conn *net.UDPConn iface io.ReadWriteCloser router *Router } func NewPeer(netName, listenIP string, port uint16) (*Peer, error) { conf, err := loadPeerConfig(netName) if err != nil { return nil, err } peer := &Peer{ ip: conf.PeerIP, hubAddr: conf.HubAddress, isMediator: conf.Mediator, apiKey: conf.APIKey, encPubKey: conf.EncPubKey, encPrivKey: conf.EncPrivKey, } _, peer.isServer = netip.AddrFromSlice(conf.PublicIP) port = determinePort(conf.Port, port) peer.conn, err = openUDPConn(listenIP, port) if err != nil { return nil, err } peer.router = NewRouter(conf, peer.conn) peer.iface, err = openInterface(conf.Network, conf.PeerIP, netName) if err != nil { log.Fatal(err) } if err != nil { return nil, err } return peer, nil } func (p *Peer) Run() { go p.netReader() p.ifReader() }