// Handle a connection => giving messages to the MsgChans func (h *Host) handleConn(c network.SecureConn) { address := c.Remote() for { ctx := context.TODO() am, err := c.Receive(ctx) // This is for testing purposes only: if the connection is missing // in the map, we just return silently h.networkLock.Lock() _, cont := h.connections[c.ServerIdentity().ID] h.networkLock.Unlock() if !cont { log.Lvl3(h.workingAddress, "Quitting handleConn ", c.Remote(), " because entry is not there") return } // So the receiver can know about the error am.SetError(err) am.From = address log.Lvl5("Got message", am) if err != nil { h.closingMut.Lock() log.Lvlf4("%+v got error (%+s) while receiving message (isClosing=%+v)", h.ServerIdentity.First(), err, h.isClosing) h.closingMut.Unlock() if err == network.ErrClosed || err == network.ErrEOF || err == network.ErrTemp { log.Lvl4(h.ServerIdentity.First(), c.Remote(), "quitting handleConn for-loop", err) h.closeConnection(c) return } log.Error(h.ServerIdentity.Addresses, "Error with connection", address, "=>", err) } else { h.closingMut.Lock() if !h.isClosing { h.networkChan <- am } h.closingMut.Unlock() } } }