package peer import ( "io" "log" "net" ) type Peer struct { // Immutable data. ip byte // Last byte of IPv4 address. hubAddr string apiKey string encPubKey []byte encPrivKey []byte signPubKey []byte signPrivKey []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, apiKey: conf.APIKey, encPubKey: conf.EncPubKey, encPrivKey: conf.EncPrivKey, signPubKey: conf.SignPubKey, signPrivKey: conf.SignPrivKey, } peer.router = NewRouter(conf) port = determinePort(conf.Port, port) conn, err := openUDPConn(listenIP, port) if err != nil { return nil, err } peer.conn = 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() }